Apakah ada cara untuk memperbarui nilai dalam suatu objek?
{
_id: 1,
name: 'John Smith',
items: [{
id: 1,
name: 'item 1',
value: 'one'
},{
id: 2,
name: 'item 2',
value: 'two'
}]
}
Katakanlah saya ingin memperbarui nama dan nilai item untuk item di mana id = 2;
Saya telah mencoba yang berikut dengan luwak:
var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set': {'items.$': update}}, function(err) { ...
Masalah dengan pendekatan ini adalah bahwa ia memperbarui / mengatur seluruh objek, oleh karena itu dalam hal ini saya kehilangan bidang id.
Apakah ada cara yang lebih baik di luwak untuk mengatur nilai-nilai tertentu dalam sebuah array tetapi membiarkan nilai-nilai lain sendiri?
Saya juga bertanya hanya untuk Orang:
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
, Anda punyaitems.users.$.status
? apakah itu akan berhasil?model.update({"_id": 1, "items.id": "2"}, {$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})
Dokumen Mongodb
sumber
Ada cara luwak untuk melakukannya.
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') });
sumber
Untuk setiap dokumen, operator pembaruan
$set
bisa menyetel beberapa nilai , jadi daripada mengganti seluruh objek dalamitems
larik, Anda bisa menyetel bidangname
danvalue
dari objek satu per satu.{'$set': {'items.$.name': update.name , 'items.$.value': update.value}}
sumber
Ada satu hal yang perlu diingat, ketika Anda mencari objek dalam array berdasarkan lebih dari satu kondisi maka gunakan $ elemMatch
Person.update( { _id: 5, grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } } }, { $set: { "grades.$.std" : 6 } } )
ini dokumentasinya
sumber
update( {_id: 1, 'items.id': 2}, {'$set': {'items.$[]': update}}, {new: true})
Berikut adalah dokumen tentang
$[]
: https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up. S []sumber
Di bawah ini adalah contoh cara memperbarui nilai dalam larik objek secara lebih dinamis.
Person.findOneAndUpdate({_id: id}, { "$set": {[`items.$[outer].${propertyName}`]: value} }, { "arrayFilters": [{ "outer.id": itemId }] }, function(err, response) { ... })
Perhatikan bahwa dengan melakukannya dengan cara itu, Anda akan dapat memperbarui tingkat yang lebih dalam dari larik bersarang dengan menambahkan tambahan
arrayFilters
seperti:"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value} "arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]
Saya harap ini membantu. Semoga berhasil!
sumber
Di luwak kita bisa update, seperti array sederhana
user.updateInfoByIndex(0,"test") User.methods.updateInfoByIndex = function(index, info) ={ this.arrayField[index]=info this.save() }
sumber
Dalam Mongoose, kita dapat mengupdate nilai array menggunakan notasi
$set
inside dot (.
) ke nilai tertentu dengan cara berikutdb.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})
sumber
Setelah mencoba solusi lain yang berfungsi dengan baik, tetapi kelemahan dari jawaban mereka adalah bahwa hanya bidang yang sudah ada yang akan memperbarui menambahkan upert padanya tidak akan melakukan apa-apa, jadi saya datang dengan ini.
Person.update({'items.id': 2}, {$set: { 'items': { "item1", "item2", "item3", "item4" } }, {upsert: true })
sumber