2017-12-04 1 views
0

Ich habe eine Sammlung mit einem Schlüssel namens fields, die ein Array von JSON-Objekten ist. Diese Objekte können options haben, was ein weiteres Array von JSON-Objekten ist. Ich versuche eine der Optionen unter optionId zu aktualisieren. Ich habe das versucht, aber es funktioniert nicht.Meteor: Update-Objekt geschachtelt zwei Arrays tief

Projects.update({ 
    'fields.options._id': optionId 
}, { 
    $set: { 
    `fields.$.options.$.title`: title 
    } 
} 

Dies findet das richtige Projektdokument, aktualisiert es jedoch nicht.

+0

Möchten Sie ein Beispieldokument in der Sammlung anzeigen? – blueren

+1

Wenn Sie so tief in ein Dokument gelangen müssen, um etwas zu ändern, sollten Sie Ihr Schema wahrscheinlich überdenken –

Antwort

2

Sie können den Operator $ nur für Arrays mit einer Ebene verwenden. Die Verwendung von array1.$.array2.$.key wird nicht unterstützt.

Wenn Sie jedoch Kenntnis von der genauen Index des Elements innerhalb des Arrays aktualisiert werden, können Sie wie so aktualisieren:

Projects.update({ 
    'fields.options._id': optionId 
}, { 
    $set: { 
    `fields.0.options.1.title`: title 
    } 
} 

Dieser Weg ist, zu aktualisieren:

Projects.find({"fields.options._id":optionId}).forEach(function(record) { 
    var match = false; 
    // iterate fields array 
    for(var i=0; i< record.fields.length; i++){ 
     // iterate options array 
     for(var j=0; j<record.fields[i].options.length; j++){ 

     if(record.fields[i].options[j]._id == optionsID){ 
      record.fields[i].options[j].title = title; 
      match = true; 
      // break; 
     } 

     } 
    } 


    if (match === true) Projects.update({ 'fields.options._id': optionId }, record); 

}); 

Source