MongoDB - 替换嵌套数组中的项

时间:2017-04-11 03:48:56

标签: mongodb mongodb-query

MongoDB does not allow在单个操作中替换数组中的项。相反,它是一个拉动,然后是推动操作。

不幸的是,我们遇到一个案例,我们最终在并行请求(分布式环境)上的数组中的同一项上遇到竞争条件,即 2x拉动首先运行,然后2x推动。这导致重复的条目,例如

{
    "_id": ...,
    "nestedArray": [
        {
            "subId": "1"
        },
        {
            "subId": "1"
        },
        {
            "subId": "2"
        }
    ]
}

有没有解决方法?

1 个答案:

答案 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>。这样,您可以确保对某个版本只进行一次修改。 希望我自己解释一下。