MongoDB中updateOne超过findOneAndUpdate的用例[重复]

Posted

技术标签:

【中文标题】MongoDB中updateOne超过findOneAndUpdate的用例[重复]【英文标题】:Use cases for updateOne over findOneAndUpdate in MongoDB [duplicate] 【发布时间】:2016-07-12 14:08:41 【问题描述】:

我认为findOneAndUpdate 执行原子操作,所以我假设updateOne 没有。

为什么你会选择updateOne 而不是findOneAndUpdate 并避免原子操作并且必须花费额外的时间检查更新是否是原子的?

我会很感激一些见解或用例。

【问题讨论】:

"findOneAndUpdate" 似乎建议“找到一个文档然后更新它”,并且该描述听起来像是它的关键点是一次性完成这两件事并原子化。关于返回的内容,它是“查找”而不是“更新”的扩展的想法,对于经历过 API 命名演变的人来说可能很明显,但对于新来的人来说不是那么明显in. 我认为在文档中突出显示不同的返回类型确实有助于在新人的头脑中弄清楚这一点。 @BlakesSeven 我上面所说的都适用于节点驱动程序文档。 @JohnnyHK 这个问题是 updateOne/findOneAndUpdate。您标记的副本是 findAndModify/update。 ***.com/questions/31808786 将是更好的链接副本。 @ZachB updateOne/findOneAndUpdate 只是 update/findAndModify 的包装器,所以欺骗仍然适用。 @ZachB 我已经添加了你列为替代骗子的那个。可能会帮助某人。 【参考方案1】:

我认为findOneAndUpdate 执行原子操作,所以我假设updateOne 没有。

你为什么要这样假设?

findOneAndUpdate 返回一个文档,而 updateOne 不返回(如果它创建了一个新文档,它只会返回 _id)。

我认为这是主要区别。所以updateOne的用例是当你不需要文档并且想节省一点时间和带宽的时候。

【讨论】:

不,它不会返回“修改后的”_id。唯一始终返回的是WriteResult,它指示匹配的数量和更新的数量。只有使用 "upsert" 选项才会返回“插入的 id”。 @BlakesSeven 对,它不会总是重新调整 id,但关键是它不会返回文档(因此发送的数据更少)。注意我已经在答案中添加了这种精确度。 @Ilya 我认为原子部分是关键区别,因为这就是所有描述给我的。此外,他们都将返回值描述为“承诺”,在我看来,这使得从阅读文档中建立直觉变得非常困难。 @NickPineda 你应该使用 MongoDB 文档(不知道你读的是哪一个)docs.mongodb.org/manual/reference/method/… @NickPineda IMO 你说得对,说命名不是很好(这不是“英语作为第二语言”的问题)。 findOneAndUpdate 并不意味着返回的文档,应该是 updateAndFetch 或其他东西。是的,缺少驱动程序文档。

以上是关于MongoDB中updateOne超过findOneAndUpdate的用例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中使用 updateOne 时如何访问 upsertedId

MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它

MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它

MongoDB updateOne查询计算

mongodb:如果元素不存在,则updateOne设置字符串数组,如果存在则保持不变

UpdateOne MongoDB 使用来自另一个字段的值进行推送