2013-09-02 2 views
3

Update вложенная коллекция в метеора не является проблемой (и это описано здесь: Updating a nested property on a collection object with $set)Когда обновление вложенные коллекции в метеор, как передать переменную пути обновления

Основной способ сделать это:

Collection.update({sel}, {"$set" : {"address.city": "new address"}}); 

Но что, если я хочу описать свой путь переменными?

Это один явно не работает:

var cityName = "NYC"; 
Collection.update({sel}, {"$set" : {"address." + cityName: "new address"}}); 

К сожалению, это одна не работает либо:

var path = "address.NYC"; 
Collection.update({sel}, {"$set" : {path: "new address"}}); 

Ни делает это один:

var object = {"address.NYC": "new address"}; 
Collection.update({sel}, {"$set" : object}); 

Ну, на самом деле, это работает, но не так, как я этого хочу. Он полностью заменяет объект «адрес», удаляя другие свойства.

Любые идеи?

Есть ли способ выбрать поле, которое я хочу обновить в части запроса?

ответ

4

Это не работает, потому что вы не можете использовать dynamic keys for object literals in javascript. Вам нужно использовать нотацию в виде скобок и создать объект, который вы хотите использовать в update. Например:

var city = 'NYC'; 
var object = {}; 
object["address." + city] = 'new address'; 

MyCollectionName.update(idOfObjectToUpdate, {$set: object}); 

Ваш последний пример должен работать, если Collection на самом деле название коллекции, и {sel} правильный селектор для того, что вы пытаетесь сделать.

+0

работал отлично; спасибо большое :) Но я не уверен, чтобы понять разницу между этой и моей последней попыткой. Могли бы вы объяснить ? – fabien

+0

Отлично - я рад, что помог. Я не вижу ничего плохого в вашей последней попытке. Построение объекта и использование литерала должны быть одинаковыми (минус использование переменной). Возможно, вы что-то угадали. –