2015-06-04 16 views
5

Ho raccolta di record ristorante. Alcuni ristoranti in questa raccolta appartengono ad alcuni gruppi (tipo di catena ristorante, ad esempio KfC ecc.) Mentre altri non hanno alcun gruppo (Individuale ristorante, che non appartiene a nessuna catena).Recupera record distinti in base ai valori per quel record con MongoDB

esempio:

collezioni Ristorante

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

collezione Catena:

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

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

ho bisogno di recuperare ristorante distinto con chain_id simile, vale a dire, unico ristorante unico dovrebbe venire se appartiene a qualche catena (chain_id! = 0)

+0

potete inserire la vostra uscita? – Yogesh

+0

come se cercassi il ristorante per l'indirizzo "somethingx". ho bisogno di ottenere i seguenti risultati {_id: "1", titolo: "rest1", indirizzo: "somethingx", chain_id: "123"}, {_id: "4", titolo: "rest4", indirizzo: "somethingx", chain_id: "0"} –

+0

non è ancora chiaro se si passa 'address: somethingx', quale collezione usare per trovare' Restaurant' o 'Chain' e quale relazione usare, citato in' chain_id! = 0' e l'output contiene '{_id:" 4 ", titolo:" rest4 ", indirizzo:" somethingx ", chain_id:" 0 "}' – Yogesh

risposta

3

È possibile utilizzare il quadro di aggregazione per questo. Il gasdotto di aggregazione avrebbe il primo passo come operatore $match che filtra i ristoranti sull'indirizzo. Il $group fase gasdotto sarà poi raggruppare i documenti filtrati dalla chiave chain_id e applica l'espressione accumulatore $first alla variabile di sistema $$ROOT su ciascun gruppo. È possibile riformattare i documenti utilizzando la fase della pipeline $project.

La pipeline di aggregazione finale che ti dà i risultati desiderati segue:

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

uscita:

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

Grazie, apprezzo davvero il tuo aiuto. questa risposta si avvicinava a ciò di cui avevo effettivamente bisogno. puoi aiutarmi con paginazione e ordinare –

+0

@VishalSharma Nessun problema, felice di essere di aiuto. Per quanto riguarda l'impaginazione e l'ordinamento, considera l'applicazione dei seguenti operatori pipeline: ** '$ limit' ** per limitare il numero di documenti nel risultato, [**' $ skip' **] (http: //docs.mongodb. org/manual/reference/operator/aggregation/skip/# pipe._S_skip) per saltare i primi 'n' documenti dove' n' è il numero di salto specificato e passa i documenti rimanenti non modificati alla pipeline, e infine [** ' $ skip' **] (http://docs.mongodb.org/manual/reference/operator/aggregation/sort/#pipe._S_sort) per riordinare il documento nel risultato con una chiave di ordinamento specificata. – chridam

Problemi correlati