2013-12-11 22 views
6

Ben formun belgeleri:

{ 
    _id : ObjectId(.....), 
    prop1 : "foo", 
    links : [ 1, 2, 3, 4 ] 
} 

{ 
    _id : ObjectId(.....), 
    prop1 : "bar", 
    links : [ 5, 6, 7, 8 ] 
} 

ben $ kullanmak, bu belgeleri işlemek için toplama çerçevesini kullanarak üretmek için gevşemek am Bağlantı dizisindeki her değer için belge.

Ancak, $ unwind çağrılmadan önce belgeleri güncellemem gereken üç durumum var, $ proje işlemine bakıyordum, ancak aşağıdaki durumlar için dizilerin nasıl oluşturulacağı veya güncelleştirileceği hakkında hiçbir bilgi bulamıyorum. bağlantılar özelliği

{ 
    _id : ObjectId(.....), 
    prop1 : "far" 
} 

eksik

1) I bağlantılar dizi özelliği

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [] 
} 

I eklemek için gereken bir boş bir dizi) bağlantılar dizisi

2 eklemek gerekir

dizisine bir değer 3) Bağlantılar dizisinin çok az değeri var

{ 
    _id : ObjectId(.....), 
    prop1 : "far", 
    links : [ 9, 10 ] 
} 

Ben Kullanılacak gerekir

+1

: Ben $ cond aşinayım http://docs.mongodb.org/manual/reference/operator/aggregation/cond/ – WiredPrairie

+0

, sorun Ben aslında diziler oluşturmak veya dizi değerlerini güncelleştirmek nasıl anlayamıyorum. Bunu daha iyi yansıtmak için yeni güncelledim. – user2808819

+0

Belgeleri kalıcı olarak değiştiremezsiniz. Sadece boru hattı sırasında bir alanın değerini değiştirebileceksin. – WiredPrairie

cevap

2

diziye ek değerler eklemek gerekir $isNull (reference):

db.test.aggregate({ $project : { the_links: { $ifNull : ["$links" , [5,6]]}} }) 

Çok basit bir mantık var başvurulan alan ($links) olması durumunda null, değiştirme değeri (bu durumda [5, 6]) kullanılır. Örneği, alanı the_links olarak yeniden adlandırdım.

links alanını varsayarsak boştur (boş bir dizi değil).

db.test.aggregate({ $project : 
    { the_links: { $cond : [ { $eq : ["$links", []]}, '$links', [5,6]]}} }) 

Ama eğer: bağlantılar null yerine boş bir dizi [] olsaydın, böyle bir şey yapabileceğini

{ 
    "result" : [ 
      { 
        "_id" : ObjectId("52a869d51d02442354276cff"), 
        "the_links" : [ 
          1, 
          2, 
          3, 
          4 
        ] 
      }, 
      { 
        "_id" : ObjectId("52a869e31d02442354276d00"), 
        "the_links" : [ 
          5, 
          6 
        ] 
      } 
    ], 
    "ok" : 1 
} 

: Verilen veriler gibi:

{ "_id" : ObjectId(...), "prop1" : "foo", "links" : [ 1, 2, 3, 4 ] } 
{ "_id" : ObjectId(...), "prop1" : "bar" } 

toplama yukarıda üretir Ya null veya [], o zaman 01 içinde $or olarak bu koşul için ek bir kontrol eklemeniz gerekiroperatörü.

Listede değerler varsa ve koşullu olarak daha fazla değer eklemek istiyorsanız, geçerli (2.4.x) MongoDB üretim yapısının etkili bir çözümü yoktur. Geliştirme şubesi, bir dizinin uzunluğunu döndürecek olan $size adlı bir operatöre sahiptir (jira). Daha sonra koşullu olarak bir başka gelişme özelliği denilen $ setUnion kullanarak ekleyebilirsiniz:

$ setUnion diziler herhangi bir sayıda Alır ve herhangi bir giriş dizide görünen unsurları içeren bu dizisi döndürür.

belirli şartlarda Değer eklemek için $ cond` `bakardık
+0

Durum 1 ve 2 için çalışacak gibi görünüyor, mevcut bir diziye değerler eklemem gereken 3. durumda herhangi bir fikrim var. Mongo 2.6'daki değişikliklere bakıyordum ve bir dizideki her girdiye uygulanabilecek bir $ map fonksiyonu var ama değer diziye eklememe izin verecek gibi görünmüyor. – user2808819

+0

aslında yeni set operatörlerini 2.6'da gördü, $ setUnion dizileri herhangi bir sayıda alacaktır ve bunların birliğini üretecek. Yeni değerleri yeni bir dizi özelliğine eklemek için $ projesini kullanabilirim ve sonra bunları birleştirmek için $ setUnion kullanabilir veya belki de değerlerden biri olarak bir literal diziyi kullanabilirim. 2.6 indirmek ve denemek zorunda kalacağım. – user2808819

+0

Ne yapmaya çalıştığınızı açıklar mısınız? Diziye değerler eklemeyi neden deniyorsunuz? Gelecekteki sürüm desteği hakkında birkaç ayrıntı ekledim. – WiredPrairie

İlgili konular