假设我想更新整个文档并覆盖除 _id 之外的所有字段。从资源消耗的 Angular 来看,这三种方法中哪种方法最好:
<强>1。将完整的文档设置为更新参数,所以所有字段都被传递
例子:
collection.update({_id: docId}, {$set:updateDoc});
<强>2。计算原始文档和更新文档之间的增量文档
例子:
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});
我对每种方法的优缺点都有一个假设,但我想确定选择什么以及为什么选择。我不确定如何精确测量它,所以也许有人可以提供帮助。
背景:
我有一个指标集合,其中很多文档经常更新,但是要更新的字段变化很大,所以很难为每个字段编写一个更新方法。相反,我打算只将所有数据放入并更新所有字段,因此我只使用一种更新方法来保持我的代码干净。
更新:
在我的设置中,文档结构中没有嵌入子文档。我的(开发)设置中也没有分片和复制。
此外,我还找到了一些方法 ( collection.explain ),我也将使用它来研究该主题。尽管如此,非常感谢任何帮助或提示。
最佳答案
这真的取决于您是否需要更新前的旧信息。如果您要覆盖信息,甚至覆盖一个键 -> 值对,那么我会使用 update
或 replaceOne
。时间上的差异可能取决于您的集合(数据集)的大小。如果这是值得关注的基准差异。我个人倾向于 replaceOne
,但这只是基于经验和我处理的集合。
对于您所解释的内容,我认为您的第二个选择既不高效也不精通内存。听起来您不需要这样的计算来简单地更新数据,而不必担心覆盖以前的信息。
关于javascript - 在 MongoDB 中更新整个文档(所有字段)的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43652525/