Mongoose,更新对象数组中的值

有没有办法更新对象的值?

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

比方说,我想更新项目的名称和价值项目,其中id = 2;

我已经尝试过以下瓦特/mongoose:

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

这种方法的问题是它更新/设置整个对象,因此在这种情况下我失去了id字段。

有没有更好的方法mongoose在数组中设置某些值,但留下其他值单独?

我也曾问过这个人:

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

你很近 你应该在你的$set使用点符号来做到这一点:

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

对于每个文档,更新操作符$set可以设置多个值 ,所以不必replaceitems数组中的整个对象,也可以分别设置对象的namevalue字段。

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

在mongoose,按照下面的程序

 .update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}}) 
 model.update({"_id": 1, "items.id": "2"}, {$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}}) 

Mongodb文件

在mongoose,我们可以更新,就像简单的数组

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