假设我要更新整个文档并覆盖除_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),我将用它来研究这个主题。尽管如此,我们非常感谢任何帮助或提示。
答案 0 :(得分:1)
这取决于您在更新之前是否需要旧信息。如果您要覆盖信息甚至是一个密钥 - >价值对然后我会使用update
或replaceOne
。差异可能是时间取决于您的集合(数据集)的大小。如果这是关注差异的基准。我个人倾向于replaceOne
,但这只是基于经验和我处理的收藏品。
对于你所解释的内容,我不认为你的第二选择是高效还是精力求精。听起来你不需要这样的计算来简单地更新数据,而不必担心覆盖以前的信息。