SORU
9 Mayıs 2012, ÇARŞAMBA


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
9 Mayıs 2012, ÇARŞAMBA


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • listedabive

    listedabive

    30 Ocak 2007
  • sWooZie

    sWooZie

    9 ŞUBAT 2006
  • the one am radio

    the one am r

    6 Mayıs 2006