Załóżmy, że mamy następującą kolekcję, która mam kilka pytań:MongoDB - Aktualizacja obiektów w dokumencie za array (zagnieżdżonego przeredagowywania)
{
"_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 - Chcę, aby zwiększyć cenę za „ITEM_NAME”:” my_item_two ", a jeśli nie istnieje, należy go dołączyć do tablicy" items ".
2 - Jak zaktualizować dwa pola w tym samym czasie. Na przykład, zwiększ cenę za "my_item_three" i jednocześnie zwiększ "total" (z tą samą wartością).
Wolę robić to po stronie MongoDB, w przeciwnym razie muszę załadować dokument po stronie klienta (Python) i skonstruować zaktualizowany dokument i zastąpić go istniejącym w MongoDB.
UPDATE To co próbowałem i działa dobrze IF obiekt istnieje:
db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})
Ale jeśli klucz nie istnieje to nic nie robi. Również aktualizuje tylko zagnieżdżony obiekt. Za pomocą tego polecenia nie można również zaktualizować pola "suma".
Myślę, że nie można tego zrobić w Mongo, chyba że z dużym bólem przy użyciu eval. Mongo jest bardzo ograniczone w opcjach danych. –
@Haapala: mongodb ma $ inc i aktualizuje z upsert – jdi
@jdi tak tak, ale to nie pomaga tutaj wiele, ale to, czego potrzebuje to wiele $ incs, warunkowo, a jeśli element nie istnieje, to $ push jest potrzebne. –