2015-06-04 11 views
5

Mam kolekcję zapisów w restauracji. Niektóre restauracje z tej kolekcji należą do pewnej grupy (restauracja typu łańcuchowego np. KfC itp.), Podczas gdy inne nie mają żadnej grupy (Indywidualne restauracja, która nie należy do żadnej sieci).Pobierz odrębny rekord na podstawie wartości dla tego rekordu z MongoDB

przykład:

zbiory restauracja

{_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"} 

kolekcja Łańcuch:

{_id:"123",chain_name:"VSWEETS",address_deatils:[ 
              {restID:"",address:"somethingx"}, 
              {restID:"",address:"somethingx"} 
             ] 
} 

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

muszę przynieść wyraźną restauracja z podobną chain_id, czyli tylko pojedynczy restauracja powinna przyjść, jeśli należy ona do jakiś łańcuch (chain_id! = 0)

+0

można zamieścić swoje wyjście? – Yogesh

+0

, jak gdybym szukał restauracji dla adresu "coś". Muszę uzyskać następujące wyniki: {_id: "1", tytuł: "rest1", adres: "somethingx", chain_id: "123"}, {_id: "4", tytuł: "rest4", adres: "somethingx", chain_id: "0"} –

+0

wciąż nie jest jasne, czy przekazujesz 'address: somethingx', a następnie która kolekcja służy do znalezienia' Restaurant' lub 'Chain' i której relacji do użytych wspomniałeś w' chain_id! = 0' i wyjście zawiera '{_id:" 4 ", tytuł:" rest4 ", adres:" somethingx ", chain_id:" 0 "}' – Yogesh

Odpowiedz

3

Możesz użyć ramy agregacji dla tego. Rurociąg agregacji będzie pierwszym krokiem jako operator, który filtruje restauracje pod adresem. $group etap rurociąg będzie wtedy grupa odfiltrowane dokumentów przez klucz chain_id i stosuje wyrażenie akumulatora $first do systemu zmiennej w każdej grupie $$ROOT. Można przekształcić dokumenty przy użyciu etapu rurociągu $project.

Ostateczna rurociąg agregacji, który daje pożądane wyniki następująco:

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" 
     } 
    } 
]) 

Wyjście:

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

Dzięki, naprawdę doceniam twoją pomoc. ta odpowiedź zbliżyła się do tego, czego naprawdę potrzebowałem. czy możesz mi pomóc w paginacji i sortowaniu –

+0

@VishalSharma Bez obaw, cieszę się z pomocy. Jeśli chodzi o stronicowanie i sortowanie, rozważ zastosowanie następujących operatorów potoku: ** '$ limit' **, aby ograniczyć liczbę dokumentów w wyniku, [**' $ skip' **] (http: //docs.mongodb. org/manual/reference/operator/aggregation/skip/# pipe._S_skip) aby pominąć pierwszy dokument 'n', gdzie' n' jest określonym numerem pominięcia i przekazuje pozostałe dokumenty niezmodyfikowane do potoku, a na koniec [** ' $ skip' **] (http://docs.mongodb.org/manual/reference/operator/aggregation/sort/#pipe._S_sort), aby zmienić kolejność dokumentu w wyniku za pomocą określonego klucza sortowania. – chridam

Powiązane problemy