¿Hay alguna forma de actualizar los valores de 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 los elementos de nombre y valor para el elemento donde id = 2;
Probé lo siguiente con mangosta:
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 / configura todo el objeto, por lo tanto, en este caso, pierdo el campo de identificación.
¿Hay una mejor manera en la mangosta de establecer ciertos valores en una matriz pero dejar otros valores en paz?
También he consultado solo 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().
});
items.$.name
, tuvisteitems.users.$.status
? ¿Funcionaría eso?model.update({"_id": 1, "items.id": "2"}, {$set: {"items.$.name": "yourValue","items.$.value": "yourvalue"}})
Documento mongodb
fuente
Hay una forma de mangosta para hacerlo.
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') });
fuente
Para cada documento, el operador de actualización
$set
puede establecer varios valores , por lo que en lugar de reemplazar todo el objeto en laitems
matriz, puede establecer los camposname
yvalue
del objeto individualmente.{'$set': {'items.$.name': update.name , 'items.$.value': update.value}}
fuente
Hay una cosa para recordar, cuando busca el objeto en la matriz sobre la base de más de una condición, use $ elemMatch
Person.update( { _id: 5, grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } } }, { $set: { "grades.$.std" : 6 } } )
aquí están los documentos
fuente
update( {_id: 1, 'items.id': 2}, {'$set': {'items.$[]': update}}, {new: true})
Aquí está el documento sobre
$[]
: https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up. S []fuente
A continuación se muestra un ejemplo de cómo actualizar el valor en la matriz de objetos de forma más dinámica.
Person.findOneAndUpdate({_id: id}, { "$set": {[`items.$[outer].${propertyName}`]: value} }, { "arrayFilters": [{ "outer.id": itemId }] }, function(err, response) { ... })
Tenga en cuenta que al hacerlo de esa manera, podrá actualizar niveles aún más profundos de la matriz anidada agregando adicionales
arrayFilters
como:"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value} "arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]
Espero que ayude. ¡Buena suerte!
fuente
En mangosta podemos actualizar, como una matriz simple
user.updateInfoByIndex(0,"test") User.methods.updateInfoByIndex = function(index, info) ={ this.arrayField[index]=info this.save() }
fuente
En Mongoose, podemos actualizar el valor de la matriz usando la notación
$set
dentro de dot (.
) a un valor específico de la siguiente maneradb.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})
fuente
Después de haber probado otras soluciones que funcionaron bien, pero el problema de sus respuestas es que solo los campos ya existentes se actualizarían y agregaron upsert no harían nada, así que se me ocurrió esto.
Person.update({'items.id': 2}, {$set: { 'items': { "item1", "item2", "item3", "item4" } }, {upsert: true })
fuente