2013-05-21 17 views
42

Tutti. Nella query del gruppo mongo, il risultato mostra solo le chiavi negli argomenti. Come mantenere il primo documento in ogni gruppo come il gruppo di query mysql. per esempio:mongo group query come mantenere i campi

------------------------------------------------------------------------- 
| name | age | sex | province | city | area | address  | 
------------------------------------------------------------------------- 
| ddl1st | 22 | 纯爷们 | BeiJing | BeiJing | ChaoYang | QingNianLu | 
| ddl1st | 24 | 纯爷们 | BeiJing | BeiJing | XuHui | ZhaoJiaBangLu | 
| 24k | 220 | ... | .... | ...  | ...  | ...   | 
------------------------------------------------------------------------- 



db.users.group({key: { name: 1},reduce: function (curr, result) { result.count ++ },initial: {count : 0 } }) 

risultato:

[ 
{ 
    "name" : "ddl1st", 
    "count" : 1 
}, 
{ 
    "name" : "24k", 
    "count" : 1 
} 
] 

Come ottenere le seguenti:

[ 
    { 
    "name" : "ddl1st", 
    "age" : 22, 
    "sex" : "纯爷们", 
    "province" : "BeiJing", 
    "city" : "BeiJing", 
    "area" : "ChaoYang", 
    "address" : "QingNianLu", 
    "count" : 1 
    }, 
    { 
    "name" : "24k", 
    "age" : 220, 
    "sex" : "...", 
    "province" : "...", 
    "city" : "...", 
    "area" : "...", 
    "address" : "...", 
    "count" : 1 
} 
] 

risposta

102

Se si desidera mantenere le informazioni circa i primi voci corrispondenti per ogni gruppo, si può provare l'aggregazione come:

db.test.aggregate({ 
    $group: { 
    _id: '$name', 
    name : { $first: '$name' } 
    age : { $first: '$age' }, 
    sex : { $first: '$sex' }, 
    province : { $first: '$province' }, 
    city : { $first: '$city' }, 
    area : { $first: '$area' }, 
    address : { $first: '$address' }, 
    count: { $sum: 1 } 
    } 
} 
+5

grazie mille! – plusor

+0

Non ho familiarità con mongoexport ma potrebbe avere qualcosa a che fare con l'utilizzo di virgolette singole e doppie. – MervS

+1

Perché hai bisogno di '{$ prima: '$ età'}' ecc.? È possibile avere solo "età: $ età"? – lightalchemist

1

non sapeva di .group aiutante, ma se si preferisce andare con il Aggregation Framework, quindi dovrai specificare quali campi restituire. Correggimi se sbaglio, ma in SQL dovresti farlo comunque.

Bene, questo è come si farebbe con il quadro di aggregazione accennato prima:

db.test.aggregate({ 
    $group: { 
    _id: { name: "$name", city: "$city", fieldName: "$fieldName" }, 
    count: { $sum: 1 } 
    } 
}) 
+7

grazie per voi aiuto. in questa query sono specificati i campi del gruppo, voglio solo raggruppare per un campo, e quindi altri utenti specificare i campi. qualche buona idea? – plusor

+1

Mi hai appena salvato la vita –

0

Ecco la risposta >>>>

$m = new \MongoDB\Driver\Manager(); 

    $command = new \MongoDB\Driver\Command([ 
     'aggregate' => 'mytestusers', 
     'pipeline' => [ 
      ['$match' => ['name' => 'Pankaj Choudhary']], 

      ['$unwind'=>'$skills'], 
      ['$lookup' => array('from'=>'mytestskills','localField'=>'skills','foreignField'=>'_id','as'=>'sdfg')], 
      ['$unwind'=>'$sdfg'], 

      ['$group'=>array('_id'=>array('_id'=>'$_id','name'=>'$name','email'=>'$email'),'skills'=>array('$push'=>'$skills'),'sdfg'=>array('$push'=>'$sdfg'))], 


     ], 
     'cursor' => new \stdClass, 
    ]); 
    $cursor = $m->executeCommand('targetjob-plus', $command); 
    $result = $cursor->toArray(); 
+0

imposta la tabella di input per prima cosa –

Problemi correlati