2014-12-13 18 views
7

Mongo kabuk sorguda yuvalanmış dizinin yalnızca eşleşen alanlarını yansıtmak ve umarım basit bir soru nedir sahip Nasıl: Bir olan bir alan vardır nerede yuvalanmış şema varBen mongodb için oldukça yeni

Bu dizinin her bir öğesinin kendisi bir dizi alanı olan bir nesne olduğu dizi. Örneğin

:

> db.mytest.insert({ 
    name: 'a', 
    top: [ 
     {x:1, y:2, nest: [{p:1, q:2}, {p:2, q:3}]}, 
     {x:2, y:3, nest: [{p:4, q:5}, {p:6, q:7}]} 
    ] 
    }) 

ben gayet p belirli değerleri sorgulayabilir ve hatta top ilk eşleştirme elemanına benim sonucunu sınırlayabilir:

> db.mytest.findOne({'top.nest': {$elemMatch: {p:6}}}, {'top.nest.$': 1}) 
{"_id":ObjectId(...), top: [{x:2, y: 3, nest: [{p:4, q:5}, {p:6, q:7}]}]} 

getiriyor Benim sorum: {'top.nest.$': 1} ve {'top.$': 1} benim projeksiyon dokümanı olarak aynı sonucu döndürür. Arama sonuçlarım yalnızca nest'un ilk eşleşen öğesini içerecek şekilde nasıl sınırlandırabilirim?

Bu sorgu türünün sonucu üzerinde yineleyen ikinci bir geçişe ihtiyacım var mı?

cevap

6

Tamam, hile aggregation framework, specifically unwind oldu.

> db.mytest.aggregate({$unwind: '$top'}, 
         {$unwind: '$top.nest'}, 
         {$match: {'top.nest.p': 6}} 
) 

rağmen ben tek bir nesne birden fazla alt maçları vardı durumunda

, bu orijinal gruplandırılmış biçimde yerine birden çok sonuç döndürecektir. Sanırım, boru hattına bir $group koyabilirim.

İlgili bağlantılara rağmen şema tasarımını şu anda tek tam çözüm olarak önerdim, bu kesinlikle hiçbir şeyden daha iyi değildir.

İlgili konular