node.js - MongoDB atomic "findOrCreate": findOne, 如果不存在则插入,但不更新

标签 node.js mongodb

正如标题所说,我想通过_id对文档进行查找(一个),如果不存在,则创建它,然后无论是找到还是创建,都在回调中返回.

如果它存在,我不想更新它,正如我读到的 findAndModify 所做的那样。我在 Stackoverflow 上看到过许多与此相关的其他问题,但同样不想更新任何内容。

我不确定是否通过创建(不存在的),这实际上是每个人都在谈论的更新,这太令人困惑了:(

最佳答案

从 MongoDB 2.4 开始,不再需要依赖唯一索引(或任何其他解决方法)来进行类似 findOrCreate 的原子操作。

这要归功于 the $setOnInsert operator 2.4 的新增功能,它允许您指定仅在插入文档时才会发生的更新。

这与 upsert 选项相结合,意味着您可以使用 findAndModify 来实现类似 findOrCreate 的原子操作。

db.collection.findAndModify({
  query: { _id: "some potentially existing id" },
  update: {
    $setOnInsert: { foo: "bar" }
  },
  new: true,   // return new doc if one is upserted
  upsert: true // insert the document if it does not exist
})

由于$setOnInsert 只影响正在插入的文档,如果找到现有文档,则不会发生任何修改。如果不存在文档,它将插入一个具有指定_id 的文档,然后执行仅插入集。在这两种情况下,文档都会被返回。

关于node.js - MongoDB atomic "findOrCreate": findOne, 如果不存在则插入,但不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50848978/

相关文章:

node.js - Node.js 中 I/O 密集型是什么意思

mongodb - 如何避免在吗啡中将空 HashMap 转换为 null?

MongoDB $redact 过滤掉数组的一些元素

node.js - 排序在 mongodb 中不起作用

node.js - 如何使用 AWS 开发工具包(在 Node.js 中)中的 putObject() 将文件从 HTTP 响应正文上传到 S3?

mysql - 安装 MySQL 对 Node JS 的支持

javascript - JSON 错误对象中奇怪的未命名属性

java - Spring 数据 MongoDB : how to partially map domain object to MongoDB?

MongoDB 聚合多个对象

mongodb - 如果发生故障的服务器从故障转移返回,会发生什么情况?