假设我要更新整个文档并覆盖_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});
例:
collection.replaceOne({_id: docId}, {$set:updateDoc});
我对每种方法的优缺点都有一个假设,但我想确定选择什么以及为什么选择。我不确定如何精确测量它,因此也许有人可以提供帮助。
背景:
我有一个度量标准集合,其中许多文档经常更新,但是要更新的字段变化很大,因此很难为每个字段编写更新方法。相反,我打算只放入所有数据并更新所有字段,因此我仅使用一种用于所有更新的更新方法来保持代码干净。
更新:
在我的设置中,文档结构中没有嵌入任何子文档。我的(dev)设置中也没有分片和复制功能。
此外,我还找到了一些方法(collection.explain),也将用于研究该主题。不过,非常感谢您的帮助或提示。
这实际上取决于您在更新之前是否需要旧信息。如果您要覆盖信息,甚至覆盖一个键->值对,那么我将使用update
或replaceOne
。差异可能在时间上有所不同,具体取决于集合(数据集)的大小。如果这是值得关注的基准差异。就个人而言,我倾向于replaceOne
,但这只是基于经验和我所处理的收藏。
对于您所解释的内容,我认为您的第二选择不是高效的,要么是精明的内存。听起来好像不需要这样的计算就可以简单地更新数据,而无需担心覆盖先前的信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句