MongoDB中updateOne和findOneAndUpdate的使用场景

47
我认为findOneAndUpdate执行原子操作,所以我认为updateOne不是原子操作。

为什么要选择updateOne而不是findOneAndUpdate,避免原子操作,花费额外的时间检查更新是否为原子操作?

我希望能得到一些见解或用例。


1
“findOneAndUpdate”似乎意味着“查找文档,然后更新它”,并且描述使其听起来重点是一次性和原子地完成这两个操作。关于返回值方面,“findOneAndUpdate”是“find”的扩展而不是“update”,对于经历过API命名演变的人来说可能很明显,但对于新手来说可能不太清楚。我认为在文档中突出显示不同的返回类型将有助于消除新手的疑惑。 - Nick Pineda
@BlakesSeven,我上面说的所有内容都适用于Node Driver文档。 - Nick Pineda
@JohnnyHK 这个问题是关于updateOne/findOneAndUpdate的。你标记的重复问题是findAndModify/update。https://dev59.com/MlwZ5IYBdhLWcg3wIdV8 是更好的重复链接。 - ZachB
@ZachB updateOne/findOneAndUpdate只是update/findAndModify的包装器,因此重复仍然适用。 - JohnnyHK
1
@ZachB 我已经将你列出的替代重复项添加了进去。可能会对某些人有所帮助。 - JohnnyHK
显示剩余3条评论
1个回答

74
我认为findOneAndUpdate执行原子操作,所以我认为updateOne不是原子操作。
为什么您这样认为? findOneAndUpdate返回一个文档,而updateOne不返回任何文档(只有在创建了新文档时返回_id)。
我认为这是主要的区别。所以updateOne的使用场景是当您不需要文档并且想节省一些时间和带宽时。

3
不,它不会返回“修改后”的 _id。唯一一致返回的是 WriteResult,其中包含了匹配和更新数量的指示器。只有使用“upsert”选项才会返回“插入的 id”。 - Blakes Seven
2
@BlakesSeven 对,它并不总是返回id,但重点是它不会返回文档(因此发送的数据更少)。注意我已经将这个准确性添加到了答案中。 - Ilya
4
@Ilya 我认为原子部分是关键的不同之处,因为这是描述给我的所有内容。此外,它们都将返回值描述为“promise”,在我看来,这使得从阅读文档中建立直觉变得非常困难。 - Nick Pineda
@NickPineda 你应该使用MongoDB文档(不知道你读的是哪个)https://docs.mongodb.org/manual/reference/method/db.collection.updateOne/ - Ilya
14
@NickPineda,我认为你的观点是正确的,命名不太好(这并不是“英语作为第二语言”的问题)。findOneAndUpdate并不意味着返回文档,应该改成updateAndFetch或其他类似的名称。同时,驱动程序文档也确实有所欠缺。 - Ilya
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接