MongoDB does not allow在单个操作中替换数组中的项。相反,它是一个拉动,然后是推动操作。
不幸的是,我们遇到一个案例,我们最终在并行请求(分布式环境)上的数组中的同一项上遇到竞争条件,即 2x拉动首先运行,然后2x推动。这导致重复的条目,例如
{
"_id": ...,
"nestedArray": [
{
"subId": "1"
},
{
"subId": "1"
},
{
"subId": "2"
}
]
}
有没有解决方法?
答案 0 :(得分:1)
我通常会在这种情况下使用乐观锁。 要做好准备,您需要在模型中添加一个版本字段,每次修改该模型时都会增加该字段。然后你使用这个方法:
Model.findOneAndUpdate(
{$and: [{_id: <current_id>}, {version: <current_version>}]},
{nestedArray: <new_nested_array>})
.exec(function(err, result) {
if(err) {
// handle error
}
if(!result) {
// the model has been updated in the mean time
}
// all is good
});
这意味着您首先需要获取模型并计算新数组<new_nested_array>
。这样,您可以确保对某个版本只进行一次修改。
希望我自己解释一下。