Есть ли способ обновить значения в объекте?
{
_id: 1,
name: 'John Smith',
items: [{
id: 1,
name: 'item 1',
value: 'one'
},{
id: 2,
name: 'item 2',
value: 'two'
}]
}
Допустим, я хочу обновить элементы имени и значения для элемента, где id = 2;
Я пробовал следующее с мангустом:
var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set': {'items.$': update}}, function(err) { ...
Проблема с этим подходом в том, что он обновляет / устанавливает весь объект, поэтому в этом случае я теряю поле id.
Есть ли лучший способ в мангусте установить определенные значения в массиве, но оставить другие значения в покое?
Я также запросил только человека:
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().
});
items.$.name
тебяitems.users.$.status
? это сработает?model.update({"_id": 1, "items.id": "2"}, {$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})
Документ Mongodb
источник
Есть способ сделать это мангустом.
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') });
источник
Для каждого документа оператор обновления
$set
может установить несколько значений , так что вместо того , чтобы заменить весь объект вitems
массиве, вы можете установитьname
иvalue
поле объекта индивидуальны.{'$set': {'items.$.name': update.name , 'items.$.value': update.value}}
источник
Следует помнить одну вещь: когда вы ищете объект в массиве на основе более чем одного условия, используйте $ elemMatch
Person.update( { _id: 5, grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } } }, { $set: { "grades.$.std" : 6 } } )
вот документы
источник
update( {_id: 1, 'items.id': 2}, {'$set': {'items.$[]': update}}, {new: true})
Вот документ о
$[]
: https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up. S []источник
Ниже приведен пример более динамичного обновления значения в массиве объектов.
Person.findOneAndUpdate({_id: id}, { "$set": {[`items.$[outer].${propertyName}`]: value} }, { "arrayFilters": [{ "outer.id": itemId }] }, function(err, response) { ... })
Обратите внимание, что, сделав это таким образом, вы сможете обновить еще более глубокие уровни вложенного массива, добавив дополнительные,
arrayFilters
например:"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value} "arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]
Я надеюсь, что это помогает. Удачи!
источник
В мангусте мы можем обновлять, как простой массив
user.updateInfoByIndex(0,"test") User.methods.updateInfoByIndex = function(index, info) ={ this.arrayField[index]=info this.save() }
источник
В Mongoose мы можем обновить значение массива, используя
$set
внутреннюю.
нотацию dot ( ), до определенного значения следующим образомdb.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})
источник
Попробовав другие решения, которые работали нормально, но подводный камень их ответов заключается в том, что только существующие поля будут обновляться, добавление к нему upsert ничего не сделает, поэтому я придумал это.
Person.update({'items.id': 2}, {$set: { 'items': { "item1", "item2", "item3", "item4" } }, {upsert: true })
источник