MongoDB, WiredTiger: 需要更新所有文档中的一个字段 (700k)。会产生哪些副作用?

MongoDB, WiredTiger: Need to update one field in all documents (700k). Which side-effects will occur?

其中一个集合包含带有字段 "sc":[float] 的文档。我想遍历所有的文档,把这个改成"sc": float,也就是去掉数组,把float值直接赋给key

不是吗,WiredTiger 附加了所有更新的文档,而不是像 MMap 那样尝试进行一些就地更新?

这基本上会使数据库的大小增加一倍,前半部分是过时的数据。

我需要调用 mongod -repair 来丢弃那些过时的文档,还是我需要做其他事情?

WT 在更新时总是重写文档,但它不是 NMAP,而是不使用填充,并且在空闲块中分配文档,所以如果我们有文档 1、2、3 - no1 有可能被移动到文件末尾(或最近的间隙),并且 no2 将分配在前面的 no1 space 中。

WT 的重要之处:

WiredTiger does ongoing compaction and reuse of space automatically.

为了确保文件的使用效率,我们可以根据 this 讨论强制 WT 使用较小的页面大小。

--wiredTigerCollectionConfigString="leaf_page_max=8KB"

另外 compact 可用于回收 space more here