2015-06-04 17 views
5

ile bu kaydın değerlerine göre ayrı bir kayıt getirme Restoran kayıt koleksiyonum var. Bu koleksiyondaki bazı restoranların bazıları (zincir tipi restoran örn. KfC vb.) Gruba aittir. Diğerleri herhangi bir gruba sahip değildir (Bireysel herhangi bir zincire ait olmayan restoran.MongoDB

örnek:

Restoran koleksiyonları

{_id:"1",title:"rest1",address:"somethingx",chain_id:"123"}, 
{_id:"2",title:"rest2",address:"somethingx",chain_id:"123"}, 
{_id:"3",title:"rest3",address:"somethingy",chain_id:"0"}, 
{_id:"4",title:"rest4",address:"somethingx",chain_id:"0"} 

Zincir toplama:

Ben aitse yani sadece tek bir restoran gelmelidir, benzer chain_id ile ayrı restoran getirmesi gerekir
{_id:"123",chain_name:"VSWEETS",address_deatils:[ 
              {restID:"",address:"somethingx"}, 
              {restID:"",address:"somethingx"} 
             ] 
} 

{_id:"456",chain_name:"KFC",address_deatils:[]} 

Bazı zincirler (chain_id! = 0)

+0

size çıkış gönderebilir? – Yogesh

+0

adresinde "thingx" adresi için restoran araması yaptım. aşağıdaki sonuçları almam gerekiyor {_id: "1", title: "rest1", address: "somethingx", chain_id: "123"}, {_id: "4", title: "rest4", address: "bir şey", chain_id: "0"} –

+0

hala "Adres" bir şey ilettiyseniz belirsiz 'o zaman' Restoran 'veya 'Zincir' bulmak için hangi koleksiyon ve hangi zinciri için kullanılan' chain_id! = 0 ' ve çıktı içerir: {_id: "4", title: "rest4", adres: "somethingx", chain_id: "0"} ' – Yogesh

cevap

3

bunun için toplama çerçevesi. Toplama boru hattı adresindeki restoranları filtreleyen ilk adım olan $match operatörüne sahip olacaktır. $group boru hattı aşaması olacaktır ardından grup süzüldü chain_id anahtarı ile belge ve her bir grup $$ROOT sistem değişken akümülatör ifade $first uygulanır. $project boru hattı aşamasını kullanarak belgeleri yeniden şekillendirebilirsiniz.

size istenen sonuçları verir nihai toplama boru hattı şu:

db.restaurant.aggregate([ 
    { 
     "$match": { "address" : "somethingx" } 
    }, 
    { 
     "$group": { 
      "_id": "$chain_id", 
      "data": { "$first": "$$ROOT" } 
     } 
    }, 
    { 
     "$project": { 
      "_id" : "$data._id", 
      "title" : "$data.title", 
      "address" : "$data.address", 
      "chain_id" : "$data.chain_id" 
     } 
    } 
]) 

Çıktı:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "4", 
      "title" : "rest4", 
      "address" : "somethingx", 
      "chain_id" : "0" 
     }, 
     { 
      "_id" : "1", 
      "title" : "rest1", 
      "address" : "somethingx", 
      "chain_id" : "123" 
     } 
    ], 
    "ok" : 1 
} 
+0

Teşekkürler, yardımlarınız için gerçekten minnettarım. Bu cevap aslında ihtiyacım olana yaklaştı. pagination & sort ile bana yardımcı olabilir –

+0

@VishalSharma Hayır endişeleri, yardım olmaktan memnun. Sayfalandırma ve sıralama için, aşağıdaki boru hattı operatörlerini uygulamayı düşünün: ** '$ limit' ** sonuçtaki doküman sayısını sınırlamak için [**' skip' **) (http: //docs.mongodb. orn/manual/reference/operator/aggregation/skip/# pipe._S_skip) 'n' belirtilen atlama numarasını gösteren ilk n 'dokümanlarını atlamak ve değiştirilmemiş kalan belgeleri pipeline geçirir ve sonunda [** ' Belgede sonucun belirtilen bir sıralama tuşuyla yeniden sıralanması için $ skip' **] (http://docs.mongodb.org/manual/reference/operator/aggregation/sort/#pipe._S_sort). – chridam