2016-07-12 31 views
0

私は更新する必要があるオブジェクトの2レベルの深いネストされた配列を持つmongodbのドキュメントを持っています。Mongodbは複数のネストした配列のオブジェクトを更新します

{ 
    "id":12362, 
    "onGoing":[ 
    { 
     "id":14597, 
     "offers":[ 
     { 
      "id":56897, 
      "status":"validated" 
     }, 
     { 
      "id":86127, 
      "status":"validated" 
     } 
     ] 
    }, 
    { 
     "id":89451, 
     "offers":[ 
     { 
      "id":12235, 
      "status":"validated" 
     }, 
     { 
      "id":56457, 
      "status":"validated" 
     } 
     ] 
    } 
    ] 
} 

idと一致するすべてのオファーを更新したいと思います。

Iは

db.repairJobs.update({ 
    "onGoing.offers":{ 
    $elemMatch:{ 
     _id:{ 
     $in:[ 
      '56897', '56457' 
     ] 
     } 
    } 
    } 
}, 
{ 
    $set:{ 
    "ongoing.offers.$.status":"ACCEPTED" 
    } 
}); 

が、エラーを取得するように更新することを試みた:要素を横断する(ongoing.offers.0.statusの継続的な)部分を使用することはできません({進行中:[{_id:NULL 、...

更新する任意の方法がありますが、解決策は、春のデータと互換性を持つようにする必要があります。

答えて

0

私の知る限り、文書にはMongoDBの深い2つのレベルを更新する方法はありません知っている。私がつまずいこのJIRAアイテム。複数使用する方法がないと思います$更新操作の演算子です。

https://jira.mongodb.org/browse/SERVER-831

私はあなたの現在のスキーマに基づいていずれかの回避策を認識していないが、私は別の文書にあなたの継続的な配列のあなたのそれぞれを分割し、のは言わせすることをお勧めいたしますでしょう。

+0

感謝 – user3794642

0

JSの道:

db.repairJobs.find().forEach(function(doc){ 
//make changes on the JSON(BSON) object here. 
db.repairJobs.save(doc); 
} 
); 

例:返信用

db.repairJobs.find().forEach(function(doc){ 
    var valueToCheck = ['56897', '56457'] 
    for(var i =0; i< doc.ongoing.offers.length; i ++){ 
     if(valueToCheck.indexOf(doc.ongoing.offers[i].id) > -1){ 
      doc.ongoing.offers[i].status = "ACCEPTED" 
     } 
    } 
    db.repairJobs.save(doc); 
    } 
); 
関連する問題