2014-04-23 12 views
9

MongoDB'nin belgelerine bakıyorum $ ve projeksiyonları. Bir yansıtma dizisinin alanlarının yalnızca bir alt kümesini nasıl döndüreceğimi anlamaya çalışıyorum, ancak bunu anlayamıyorum.Yalnızca projeksiyon dizisi alt belgesindeki belirli alanları döndürün

İlgili mesajlar:

  • Ben mongodb aggregation framework - Fetch first document's field of the nested array bir $slice gerçekleştirmek için çalışmıyorum. Alt belgeyi Return only array value in mongo projection'dan düzleştirmeye çalışıyorum, çünkü hala üstteki belgeden bazı alanlar istiyorum.

    db.test.findOne({"array.key": 1}, {"array.$.name": 1, "extra": 1}) 
    

    Ki bu sadece name dönmek için beklediğiniz:

    { 
        "_id": "A", 
        "array": [ 
         {"key": 1, "name": "foo", "data": {}}, 
         {"key": 2, "name": "bar", "data": {}} 
        ], 
        "extra": {} 
    }, 
    { 
        "_id": "B", 
        "array": [ 
         {"key": 3, "name": "spam", "data": {}}, 
         {"key": 4, "name": "eggs", "data": {}} 
        ], 
        "extra": {} 
    } 
    

    ben etkili gerçekleştirmek istediğiniz sorgu:

ben test koleksiyonunda aşağıdaki belgeleri var ki Alt-belge altında key 1 olduğu dizisinde. O sorgu gerçekleştirirseniz Örneğin,

{ 
    "_id": "A", 
    "array": [ 
     {"name": "foo"} 
    ], 
    "extra": {} 
} 

Ama bu yerine alıyorum: sorgusu yapıyor aynıdır

{ 
    "_id": "A", 
    "array": [ 
     {"key": 1, "name": "foo", "data": {}} 
    ], 
    "extra": {} 
} 

:

db.test.findOne({"array.key": 1}, {"array.$": 1, "extra": 1}) 

şunlarla denedim sonuç aynı:

Tüm alt belgenin yerine yalnızca array.$ alanlarının bir alt kümesini döndürmenin bir yolu var mı?

cevap

7

Özellikle toplu kullanmadan bunu yapmaya çalışıyor musunuz?

db.test.aggregate([{$unwind:"$array"}, 
        {$match:{"array.key":1}}, 
        {$project:{"array.name":1, extra:1}}]) 
+0

Birden çok belgeyi bir araya getirmediğim için, kümelenmenin yapmaya çalıştığım şeyi gerçekleştirebileceğinin farkında değildim. – cpburnz

+5

Ama eğer agregaları kullanamıyorsanız? $ Operatörü kullanabilir ve bu gibi bir güncellemede bir alt alana erişebildiğiniz için biraz kafam karıştı: db.students.update ( {_id: 4, "grades.grade": 85}, {$ set: {"notları. $. std": 6}} ) ' – Bilk

İlgili konular