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);

Bir JSON yanıt NodeJS (nesne/dizi dize...
PHP nesne ilişkisel dizi dönüştürmek...
Bir döngü içinde nesne harfleri bir di...
Ruby Dizi find_first nesne?...
İlişkisel dizi Javascript foreach döng...