MongoDB:保存文档是否会重写整个文档?

时间:2012-06-25 02:28:41

标签: mongodb

我的集合domain包含包含域信息的文档。部分原因是历史的whois记录,可能是零或更多,到目前为止占据了文档的大部分空间。

如果我加载整个文档,更改小的内容(比如更新数字字段)并使用save()方法将mongo将整个文档刷新到磁盘或仅更新已更改的BSON?最后我的问题是,我是否应该使用update()来复制我的代码以节省I / O,或者我应该使用save()

这不仅仅是由于懒惰,文档(在完整阅读之后)经历了一系列修改/处理文档的步骤,如果进行了任何更改,则保存整个文档。但是如果保存文档的成本很高,那么我可能不得不以不同的方式思考它......

3 个答案:

答案 0 :(得分:4)

您可以使用$set更新文档中的单个字段。这将修改磁盘上的字段。但是,if the document grows beyond the size before the update, the document may have to be relocated on disk

同时,here is what the documentation says about save versus update

>// x is some JSON style object
>db.mycollection.save(x); // updates if exists; inserts if new
>
>// equivalent to:
>db.mycollection.update( { _id: x._id }, x, /*upsert*/ true );

<强>参考

答案 1 :(得分:2)

这取决于您使用的客户端库。例如,Mongoid(ruby中的ODM)足够聪明,只能发送已更改的字段(使用$set命令)。它有时太聪明了,并没有捕捉到我对嵌套哈希所做的更改。但是我从未见过它发送过不变的字段。

其他库/驱动程序可能表现不同。

答案 2 :(得分:1)

我知道这个问题很老,但了解它如何帮助您设计数据库结构非常有用。以下是有关MongoDB存储引擎的详细信息: https://docs.mongodb.com/v3.2/faq/storage/

该文件回答了这个问题。基本上,如果更新MongoDB中的整数字段,它会将整数所在的内存中的页面(通常为4k)标记为脏,并在下一次磁盘刷新时将内存页写入磁盘。因此,如果您的文档大小非常大,则可能只会将部分文档写入磁盘。

但是,还有很多其他情况。如果要向文档中填充更多数据,MongoDB可能需要将整个文档移动到新位置以使文档增长。在这种情况下,整个文档将写入磁盘。