Supposons que nous avons la collection suivante, que j'ai quelques questions sur:MongoDB - Mise à jour des objets dans un tableau de documents (mise à jour imbriquée)
{
"_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 - Je veux augmenter le prix pour « item_name »: » my_item_two "et s'il n'existe pas, il doit être ajouté au tableau" items ".
2 - Comment puis-je mettre à jour deux champs en même temps. Par exemple, augmentez le prix pour "my_item_three" et en même temps augmentez le "total" (avec la même valeur).
Je préfère faire cela du côté MongoDB, sinon je dois charger le document côté client (Python) et construire le document mis à jour et le remplacer par le document existant dans MongoDB.
MISE À JOUR Voici ce que j'ai essayé et fonctionne très bien si l'objet Exists:
db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})
Mais si la clé n'existe pas il ne fait rien. De plus, il ne met à jour que l'objet imbriqué. Cette commande ne permet pas non plus de mettre à jour le champ "total".
Je pense que vous ne pouvez pas le faire en mongo, sauf peut-être avec beaucoup de mal en utilisant l'eval. Mongo est très limité dans les opérations de données. –
@Haapala: mongodb a $ inc et mise à jour avec upsert – jdi
@jdi oui oui, mais ça n'aide pas beaucoup ici, mais ce dont il a besoin c'est de multiples $ incs, conditionnellement, et si l'item n'existe pas, alors un push $ est nécessaire. –