正如标题所说,我想通过_id执行文档的查找(一个),如果不存在,则创建它,然后是否找到它或者是否已创建它,让它在回调中返回.
如果它存在,我不想更新它,因为我读过findAndModify.我在Stackoverflow上看到了很多关于此问题的其他问题,但同样,不希望更新任何内容.
我不确定是否通过创建(不存在),这实际上是每个人都在谈论的更新,它都是如此令人困惑:(
num*_*407 186
从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复制一个文档,然后执行仅插入集.在这两种情况下,都会返回文档.
han*_*aad 10
采用最新的驱动程序(> 2版),您将使用findOneAndUpdate作为findAndModify被废弃。这种新方法需要3个参数的filter,该update对象(其中包含您的默认属性,应插入一个新的对象),并options在那里你必须指定更新插入操作。
使用promise语法,它看起来像这样:
const result = await collection.findOneAndUpdate(
  { _id: new ObjectId(id) },
  {
    $setOnInsert: { foo: "bar" },
  },
  {
    returnOriginal: false,
    upsert: true,
  }
);
const newOrUpdatedDocument = result.value;
| 归档时间: | 
 | 
| 查看次数: | 51787 次 | 
| 最近记录: |