Mongoose, обновлять значения в массиве объектов
Есть ли способ обновить значения в объекте?
{
_id: 1,
name: 'John Smith',
items: [{
id: 1,
name: 'item 1',
value: 'one'
},{
id: 2,
name: 'item 2',
value: 'two'
}]
}
Предположим, я хочу обновить имена и значения для элемента, где id = 2;
Я пробовал следующий w/mongoose:
var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set': {'items.$': update}}, function(err) { ...
Проблема с этим подходом заключается в том, что он обновляет/устанавливает весь объект, поэтому в этом случае я теряю поле id.
Есть ли лучший способ в mongoose установить определенные значения в массиве, но оставить другие значения в одиночку?
Я также запросил только для Person:
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().
});
Ответы
Ответ 1
Ты близко; вы должны использовать точечную нотацию при использовании оператора $
update, чтобы сделать это:
Person.update({'items.id': 2}, {'$set': {
'items.$.name': 'updated item2',
'items.$.value': 'two updated'
}}, function(err) { ...
Ответ 2
model.update({"_id": 1, "items.id": "2"},
{$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})
Mongodb документ
Ответ 3
Для каждого документа оператор обновления $set
может установить несколько значений, поэтому вместо замены всего объекта в массиве items
, вы можете установить поля name
и value
объекта индивидуально.
{'$set': {'items.$.name': update.name , 'items.$.value': update.value}}
Ответ 4
В Mongoose мы можем обновить значение массива, используя $set
в нотации точка (.
), До определенного значения следующим образом
db.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})
Ответ 5
В мангусте мы можем обновить, как простой массив
user.updateInfoByIndex(0,"test")
User.methods.updateInfoByIndex = function(index, info) ={
this.arrayField[index]=info
this.save()
}
Ответ 6
update(
{_id: 1, 'items.id': 2},
{'$set': {'items.$[]': update}},
{new: true})
Вот документ о $ [].
Ответ 7
Следует помнить одну вещь: когда вы ищете объект в массиве на основе более чем одного условия, используйте $ elemMatch
Person.update(
{
_id: 5,
grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
},
{ $set: { "grades.$.std" : 6 } }
)
вот документы
Ответ 8
Есть мангустовый способ сделать это.
const itemId = 2;
const query = {
item._id: itemId
};
Person.findOne(query).then(doc => {
item = doc.items.id(itemId );
item["name"] = "new name";
item["value"] = "new value";
doc.save();
//sent respnse to client
}).catch(err => {
console.log('Oh! Dark')
});