Метеор: объект обновления вложен в два массива в глубину

У меня есть коллекция с ключом fields, который представляет собой массив объектов JSON. Эти объекты могут иметь options, который является еще одним массивом объектов JSON. Я пытаюсь обновить один из вариантов на optionId. Я пробовал это, но это не работает.

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

Это находит правильный документ проекта, но не обновляет его.


person Jonathan Sutherland    schedule 04.12.2017    source источник
comment
Не могли бы вы показать образец документа в коллекции?   -  person blueren    schedule 04.12.2017
comment
Если вам нужно так глубоко проникнуть в документ, чтобы что-то изменить, вам, вероятно, следует переосмыслить свою схему.   -  person Fred Stark    schedule 05.12.2017


Ответы (1)


Вы можете использовать оператор $ только для одноуровневых массивов. Использование array1.$.array2.$.key не поддерживается.

Однако, если вы знаете точный индекс обновляемого элемента в массиве, вы можете обновить его следующим образом:

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

Это один из способов обновления:

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 );

});

Источник

person blueren    schedule 04.12.2017