2013-05-21 14 views
42

Herkes. Mongo grup sorgusunda, sonuç yalnızca argümanlardaki tuşları gösterir. Her grupta mysql sorgu grubu gibi ilk belge nasıl saklanır. örneğin :mongo grup sorgusu alanları nasıl tutacağınız

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

sonucu:

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

almak nasıl aşağıdaki: Birlikte gitmeyi tercih eğer

[ 
    { 
    "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 
} 
] 

cevap

102

Her grup için ilk eşleşen girişleriyle ilgili bilgileri saklamak istiyorsanız, gibi toplayarak deneyin edebilirsiniz:

Eh, bundan önce Bahsettiğiniz Toplama Çerçevesi ile yapacağını nasıl

yardımcı için
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

çok teşekkür ederim! – plusor

+0

Ben mongoexport aşina değilim ama tek ve çift tırnak kullanımı ile ilgili bir şey olabilir. – MervS

+1

Niçin '{$ first: '$ age'}' vb. Sadece yaşı: $ yaş 'mümkün mü? – lightalchemist

1

Ben yaklaşık .group yardımcı biliyorum ama vermedi Aggregation Framework, daha sonra hangi alanların döndüğünü belirtmeniz gerekecek. Yanılıyorsam düzeltin, ama SQL'de bunu yapmak zorunda kalacaksınız.

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

sayesindedir. Bu sorguda grup belirtilen alanlar, sadece bir alandan grup istiyorum ve sonra diğerleri alanları belirtin. herhangi iyi bir fikir? – plusor

+1

Hayatımı kurtardın sadece –

0

İşte cevabı >>>>

$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

giriş tablonuzu lütfen önce ayarlayın –