正如标题所说,我想通过_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
})
Run Code Online (Sandbox Code Playgroud)
由于$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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
51787 次 |
最近记录: |