假设有一个集合,其中包含field_1
唯一的文档
[
{
field_1: 'abc',
field_2: 0,
field_3: []
}
]
我想添加其他文档,但field_1
与'abc'
相同。在这种情况下,我想增加field_2
,并在更新时将元素追加到field_3
。如果field_1
不同,请创建另一个文档。
处理此类查询的最佳方法是什么?我的第一个想法是搜索,然后插入,如果没有找到文件,或有更好的方法?这种方法的问题是,如果我一次插入多个文档,我就无法使用搜索,如果没有找到文档,请插入'有效地接近。
答案 0 :(得分:2)
Mongoose现在使用findOneAndUpdate本地支持它(调用MongoDB findAndModify)。
upsert = true选项会创建对象(如果它不存在)。默认为false。
MyModel.findOneAndUpdate(
{foo: 'bar'}, // find a document with that filter
modelDoc, // document to insert when nothing was found
{upsert: true, new: true, runValidators: true}, // options
function (err, doc) { // callback
if (err) {
// handle error
} else {
// handle document
}
}
);
答案 1 :(得分:1)
如果field_1
的唯一性由唯一索引强制执行,则可以使用一种乐观锁定。
首先你尝试更新:
db.collection.update(
{
field_1: 'abc'
},
{
$inc: {field_2: 1},
$push: {field_3: 'abc'},
}
);
并检查操作结果 - 如果更新了1个文档,则无需再执行任何操作。否则,它是第一个带有field_1 =='abc'的文档,因此您尝试插入它:
db.collection.insert(
{
field_1: 'abc',
field_2: 0,
field_3: []
}
);
并发现错误。如果没有错误,则不再需要其他操作。否则会有并发插入,因此您需要再次重复更新查询。