Angenommen, wir die folgende Sammlung, die ich einige Fragen zu haben:MongoDB - Update Objekte in einem Dokument des Arrays (verschachtelte Aktualisierung)
{
"_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 - Ich mag für „item_name“, den Preis zu erhöhen:“ my_item_two "und falls es nicht existiert, sollte es an das" items "-Array angehängt werden.
2 - Wie kann ich zwei Felder gleichzeitig aktualisieren? Erhöhen Sie beispielsweise den Preis für "my_item_three" und erhöhen Sie gleichzeitig die "Gesamtmenge" (mit dem gleichen Wert).
Ich bevorzuge dies auf der MongoDB-Seite, andernfalls muss ich das Dokument in Client-Seite (Python) laden und das aktualisierte Dokument erstellen und durch das vorhandene Dokument in MongoDB ersetzen.
UPDATE Dies ist, was ich habe versucht, und funktioniert gut wenn das Objekt vorhanden:
db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})
Aber wenn der Schlüssel nicht existiert es tut nichts. Außerdem aktualisiert es nur das verschachtelte Objekt. Mit diesem Befehl gibt es auch keine Möglichkeit, das Feld "total" zu aktualisieren.
Ich denke, Sie können dies nicht in Mongo tun, außer vielleicht mit viel Schmerz mit der Eval. Mongo ist in Datenoperationen sehr eingeschränkt. –
@Haapala: mongodb hat $ inc und update mit upsert – jdi
@jdi ja ja, aber es hilft hier nicht viel, aber was er braucht sind mehrere $ incs, bedingt, und wenn der Artikel nicht existiert, dann ist ein $ push erforderlich. –