2017-04-11 5 views
1

MongoDB does not allowは、1回の操作で配列内の項目を置き換えます。代わりにプッシュ操作でプッシュ操作が行われます。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>を計算する必要があることを意味します。このようにして、特定のバージョンに対して1つの修正が行われることを確実にすることができます。 私は自分自身について説明しました。

+0

MongoDBがまだSQLキャンプから嫌われているのは、そういうことだと思います。:)以前はそのような解決策を打ちましたが、それは正しくはないと感じました。おかげで –

+0

あなたはMongoDBで作業するためのアプローチ全体を変更する必要があります。あなたの要件はわかりませんが、おそらくMongoDBと連携してトランザクションをサポートできるRedisを調査しようとします。 – enrichz

関連する問題