Supongamos que tenemos la siguiente colección, que tengo algunas preguntas acerca de:MongoDB - Actualización de objetos en serie (actualización anidada) de un documento
{
"_id" : ObjectId("4faaba123412d654fe83hg876"),
"user_id" : 123456,
"total" : 100,
"items" : [
{
"item_name" : "my_item_one",
"price" : 20
},
{
"item_name" : "my_item_two",
"price" : 50
},
{
"item_name" : "my_item_three",
"price" : 30
}
]
}
1 - Quiero aumentar el precio de "item_name":" my_item_two "y si no existe, debe adjuntarse a la matriz de" elementos ".
2 - ¿Cómo puedo actualizar dos campos al mismo tiempo. Por ejemplo, aumente el precio de "my_item_three" y al mismo tiempo aumente el "total" (con el mismo valor).
Prefiero hacer esto en el lado MongoDB, de lo contrario tengo que cargar el documento en el lado del cliente (Python) y construir el documento actualizado y reemplazarlo por el existente en MongoDB.
ACTUALIZACIÓN Esto es lo que he probado y funciona bien si el objeto existe:
db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})
Pero si no existe la clave no hace nada. También solo actualiza el objeto anidado. No hay forma con este comando de actualizar el campo "total" también.
Creo que no puedes hacer esto en mongo, excepto tal vez con mucho dolor usando el eval. Mongo es muy limitado en operaciones de datos. –
@Haapala: mongodb tiene $ inc y actualiza con upsert – jdi
@jdi sí sí, pero no ayuda mucho aquí, pero lo que necesita es múltiples $ incs, condicionalmente, y si el elemento no existe, entonces un $ push es necesario. –