MongoDB - iç içe geçmiş bir Dizi bir nesne Güncelleme
Farz hakkında birkaç sorum var şu toplama, var:
{
"_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 - fiyatı artırmak istiyorum"":"" . my_item_two ıtem_name ^strong>ve eğer mevcut değil"öğeleri" dizisi. eklenmiş olmalı
Nasıl aynı anda iki alanları güncelleyebilir miyim 2 -. Örneğin, fiyat artışı "" ve aynı zamanda artış "" (aynı değer). toplam my_item_three
MongoDB tarafında bunu yapmak için tercih ediyorum, aksi takdirde istemci tarafı belge (Python) yük ve güncelleştirilmiş belge oluşturmak ve MongoDB varolan ile değiştirmek zorundayım.
GÜNCELLEME Bunu denedim ve gayet iyi çalışıyorEğer Nesne VARSA:
db.test_invoice.update({user_id : 123456 , "items.item_name":"my_item_one"} , {$inc: {"items.$.price": 10}})
Ama eğer anahtar mevcut değilse bile hiçbir şey yapmaz. Ayrıca sadece güncelleştirmeler iç içe geçmiş nesne. Bu komut ile "iyi." alan toplam güncelleme yok
CEVAP
Soru #1, hadi iki parçaya bölün. İlk olarak, artışı "öğeleri.herhangi bir belge"eşit "". my_item_two ıtem_name Bu konumsal kullanman gerekecek "$" operatörü. Gibi bir şey
db.bar.update( {user_id : 123456 , "items.item_name" : "my_item_two" } ,
{$inc : {"items.$.price" : 1} } ,
false ,
true);
Bu sadece "ıtem_name" eşit "my_item_two", artan bir işe yaramaz). dizi başka bir belge varsa (yani herhangi bir dizinin ilk eşleşen alt artırır unutmayın Ama bu istediğiniz şey olabilir.
İkinci bölümü daha zor. Bir "my_item_two şöyle:" gibi . olmadan bir diziye yeni bir öğe basabiliriz
db.bar.update( {user_id : 123456, "items.item_name" : {$ne : "my_item_two" }} ,
{$addToSet : {"items" : {'item_name' : "my_item_two" , 'price' : 1 }} } ,
false ,
true);
Sorunuz için #2, cevap daha kolay. Artış toplam ve item_three fiyatı "my_item_three," aynı anda birden çok alanda. $ınc operatörü kullanabilirsiniz içeren herhangi bir belge Gibi bir şey
db.bar.update( {"items.item_name" : {$ne : "my_item_three" }} ,
{$inc : {total : 1 , "items.$.price" : 1}} ,
false ,
true);

Nasıl sil foreach döngü içinde dizi ne...
Python string.(liste) dizisi yerine st...
Nesne ve dizi başlatıcılar için Reshar...
MongoDB koleksiyon nesnesine bir dizi ...
Nasıl powershell'de bir dize için bir ...