7

我有domain包含域信息的文档的集合。其中一部分是历史 whois 记录,它可能是零个或多个,并且到目前为止占据了文档的大部分空间。

如果我加载整个文档,更改一些小的内容(例如更新数字字段)并使用该save()方法将 mongo 将整个文档刷新到磁盘或仅更新已更改的 BSON?最终我的问题是,我应该费心用update()'s 使我的代码复杂化以节省 I/O 还是应该只使用 's save()

这不仅仅是因为懒惰,文档(在完整阅读之后)会经过一系列步骤来修改/处理文档,如果进行了任何更改,则保存整个文档。但是如果保存文档的成本很高,那么也许我必须换一种方式考虑......

4

3 回答 3

6

您可以使用 更新文档中的单个字段$set。这将修改磁盘上的字段。但是,如果文档的大小超过了更新前的大小,则可能必须将文档重新定位到磁盘上

同时,以下是文档中有关savevsupdate的内容:

>// 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 );

参考

于 2012-06-25T02:46:20.460 回答
2

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

其他库/驱动程序的行为可能不同。

于 2012-06-25T07:51:24.203 回答
2

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

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

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

于 2016-11-09T20:52:56.343 回答