一尘不染

MongoDB原子“ findOrCreate”:findOne,如果不存在则插入,但不更新

node.js

如标题所示,我想通过_id对文档执行查找(一个),如果不存在,则创建它,然后找到它还是创建它,然后在回调中返回它。

我不想更新它是否存在,就像我读过的findAndModify一样。我在Stackoverflow上看到了许多其他与此相关的问题,但是同样,不想更新任何内容。

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


阅读 195

收藏
2020-07-07

共1个答案

一尘不染

从MongoDB 2.4开始,不再需要findOrCreate像原子操作那样依赖唯一索引(或任何其他解决方法)。

这要归功于2.4新增$setOnInsert运算符运算符使您可以指定仅在插入文档时进行的更新。

结合使用该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向上插入一个文档,然后执行仅插入集。在两种情况下,都将返回文档。

2020-07-07