在MongoDB中更新整个文档(所有字段)的最快方法是什么?

时间:2017-04-27 08:28:05

标签: javascript mongodb

假设我要更新整个文档并覆盖除_id之外的所有字段。在资源消耗方面,这三种方法中最好的是:

1。将完整文档设置为更新参数,以便传递所有字段

示例:

collection.update({_id: docId}, {$set:updateDoc});

2。计算原始文件和updateDoc

之间的增量文档

示例:

const originalDoc = collection.findOne(docId);
const deltaDoc = calculateDeltaFct(originalDoc, updateDoc); //get changed fields
collection.update({_id: docId}, {$set:deltaDoc});

第3。使用Mongo 3.2. replaceOne function

示例:

collection.replaceOne({_id: docId}, {$set:updateDoc});

我假设每种方法的优点和缺点,但我想确定选择什么以及为什么。我不确定如何精确测量它,所以也许有人可以提供帮助。

背景

我有一个指标集合,其中许多文档经常更新,但要更新的字段变化很大,因此很难为每个字段编写更新方法。相反,我打算只抛出所有数据并更新所有字段,因此我只使用一种更新方法保持我的代码清洁。

更新

在我的设置中,文档结构中没有嵌入子文档。我的(dev)设置中也没有分片和复制。

此外,我找到了一些方法(collection.explain),我将用它来研究这个主题。尽管如此,我们非常感谢任何帮助或提示。

1 个答案:

答案 0 :(得分:1)

这取决于您在更新之前是否需要旧信息。如果您要覆盖信息甚至是一个密钥 - >价值对然后我会使用updatereplaceOne。差异可能是时间取决于您的集合(数据集)的大小。如果这是关注差异的基准。我个人倾向于replaceOne,但这只是基于经验和我处理的收藏品。

对于你所解释的内容,我不认为你的第二选择是高效还是精力求精。听起来你不需要这样的计算来简单地更新数据,而不必担心覆盖以前的信息。