2017-04-11 47 views
1

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

不幸的是,我们有一种情况是,在并行请求(分布式环境)中阵列中的同一项上出现竞态条件,即 2x拉运行,然后2x运行。这导致重复的条目,例如

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

是否有任何解决方法?

回答

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

+0

我想这就是为什么MongoDB仍然从SQL阵营中受到憎恨...... :)之前提出了这样的解决方案,但它感觉不对。谢谢 –

+0

你需要改变你的整个方法来使用MongoDB。我不知道你的要求,但也许试着调查Redis,它可以与MongoDB结合使用并支持事务处理。 – enrichz