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/16358857/

相关文章:

mongodb - 如何通过 Mongoid 中的动态属性对文档进行排序

javascript - 从函数返回结果(javascript、nodejs)

javascript - 如何在socket.io中发出数据?

在客户端创建 MongoDB ObjectId

javascript - setInterval 有效 setTimeout 无效

MongoDB:根据$或值的顺序查找一个文档?

node.js - 登录后需要做什么才能从 mongodb 中提取用户的个人资料?

javascript - 如果字段为空,Passport.js 不会调用 LocalStrategy

javascript - 在 Node 中上传文件的管道与缓冲

javascript - 使用内联 javascript 渲染 javascript 文件