Mangusto, atualize os valores na matriz de objects

Existe uma maneira de atualizar valores em um object?

{ _id: 1, name: 'John Smith', items: [{ id: 1, name: 'item 1', value: 'one' },{ id: 2, name: 'item 2', value: 'two' }] } 

Vamos dizer que eu quero atualizar o nome e itens de valor para o item onde id = 2;

Eu tentei o seguinte w / mongoose:

 var update = {name: 'updated item2', value: 'two updated'}; Person.update({'items.id': 2}, {'$set': {'items.$': update}}, function(err) { ... 

Problema com essa abordagem é que ela atualiza / define o object inteiro, portanto, neste caso, perco o campo id.

Existe uma maneira melhor no mangusto para definir determinados valores em uma matriz, mas deixar outros valores sozinhos?

Eu também questionei apenas a Pessoa:

 Person.find({...}, function(err, person) { person.items ..... // I might be able to search through all the items here and find item with id 2 then update the values I want and call person.save(). }); 

Você está perto; você deve usar a notação de ponto em seu $set para fazer isso:

 Person.update({'items.id': 2}, {'$set': { 'items.$.name': 'updated item2', 'items.$.value': 'two updated' }}, function(err) { ... 
 model.update({"_id": 1, "items.id": "2"}, {$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}}) 

Documento do Mongodb

Para cada documento, o operador de atualização $set pode definir vários valores , portanto, em vez de replace o object inteiro na matriz de items , você pode definir os campos de name e value do object individualmente.

 {'$set': {'items.$.name': update.name , 'items.$.value': update.value}} 

Em mongoose podemos atualizar, como array simples

 user.updateInfoByIndex(0,"test") User.methods.updateInfoByIndex = function(index, info) ={ this.arrayField[index]=info this.save() } 

No Mongoose, podemos atualizar o valor da matriz usando $set dentro da notação ponto ( . ) Para um valor específico da seguinte maneira

 db.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}}) 
 update( {_id: 1, 'items.id': 2}, {'$set': {'items.$[]': update}}, {new: true}) 

Aqui está o documento sobre $ [] .