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

  • AmeriiK_HD

    AmeriiK_HD

    16 AĞUSTOS 2012
  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006