Mongoose, actualiza los valores en una matriz de objetos

¿Hay alguna manera de actualizar los valores en un objeto?

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

Digamos que quiero actualizar el nombre y los elementos de valor para el elemento donde id = 2;

He intentado el siguiente w / mongoose:

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

El problema con este enfoque es que actualiza / establece el objeto completo, por lo tanto, en este caso, pierdo el campo de identificación.

¿Hay alguna manera mejor de mongoose de establecer ciertos valores en una matriz pero dejar en paz otros valores?

También he preguntado por la persona:

 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(). }); 

Estás cerca; debe usar la notación de puntos en su $set para hacer eso:

 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 de Mongodb

Para cada documento, el $set operador de actualización puede establecer múltiples valores , por lo que en lugar de reemplazar el objeto completo en la matriz de items , puede establecer los campos de name y value del objeto individualmente.

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

En mongoose podemos actualizar, como simple matriz

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

En Mongoose, podemos actualizar el valor de la matriz usando $set dentro de la notación punto ( . ) A un valor específico de la siguiente manera

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

Aquí está el documento sobre $ [] .