2016-07-12 12 views
0

Ich habe ein Dokument in Mongodb mit 2 Ebenen tief verschachtelten Array von Objekten, die ich aktualisieren muss, so etwas.Mongodb ein Objekt in multi-geschachtelten Array aktualisieren

{ 
    "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" 
     } 
     ] 
    } 
    ] 
} 

Ich möchte alle Angebote aktualisieren, die mit ihrer ID übereinstimmen.

Ich habe wie

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

Aber immer den Fehler zu aktualisieren versucht: kann nicht den Teil (laufend von ongoing.offers.0.status) das Element zu durchqueren ({laufenden: [{_id: null ...

gibt es Möglichkeiten zu aktualisieren, müssen die Lösung mit Feder Daten kompatibel sein.

Antwort

0

Soweit ich weiß, gibt es keine Möglichkeit Dokumente auf zwei Ebenen tief in MongoDB zu aktualisieren. ich stolperte über Ich denke nicht, dass es eine Möglichkeit gibt, mehrerezu verwendenOperatoren in Update-Operationen.

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

Ich bin nicht bekannt, dass Abhilfen auf Ihrem aktuellen Schema basiert, aber ich würde Ihnen empfehlen, sagen zu lassen, teilen Sie Ihre jedes Ihrer laufenden Arrays in verschiedene Dokumente.

+0

Danke für die Antwort – user3794642

0

Die JS Art und Weise:

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

Beispiel:

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); 
    } 
); 
Verwandte Themen