반응형
mongo 그룹 쿼리 필드 유지 방법
각자 모두. mongo 그룹 쿼리에서 결과는 인수의 키만 표시합니다. mysql 쿼리 그룹과 같이 각 그룹의 첫 번째 문서를 유지하는 방법. 예를 들면 :
-------------------------------------------------------------------------
| 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 } })
결과:
[
{
"name" : "ddl1st",
"count" : 1
},
{
"name" : "24k",
"count" : 1
}
]
다음을 얻는 방법 :
[
{
"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
}
]
각 그룹의 첫 번째 일치 항목에 대한 정보를 유지하려면 다음과 같이 집계를 시도 할 수 있습니다.
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 }
}
}
그건 그렇고, 첫 번째 문서뿐만 아니라 유지하려면 $ addToSet 를 사용할 수 있습니다 . 예 :
db.test.aggregate({
$group: {
_id: '$name',
name : { $addToSet: '$name' }
age : { $addToSet: '$age' },
count: { $sum: 1 }
}
}
.group
헬퍼에 대해서는 몰랐지만 Aggregation Framework 를 선호하는 경우 반환 할 필드를 지정해야합니다. 내가 틀렸다면 저를 정정하십시오. 그러나 SQL에서는 어쨌든 그렇게해야합니다.
음, 이것은 앞에서 언급 한 집계 프레임 워크를 사용하여 수행하는 방법입니다.
db.test.aggregate({
$group: {
_id: { name: "$name", city: "$city", fieldName: "$fieldName" },
count: { $sum: 1 }
}
})
I came here looking for an answer but wasn't happy with the selected answer (especially given it's age). I found this answer that is a better solution (adapted):
db.test.aggregate({
$group: {
_id: '$name',
person: { "$first": "$$ROOT" },
count: { $sum: 1 }
},
{
"$replaceRoot": { "newRoot": "$person" }
}
}
You can try out this
db.test.aggregate({
{ $group:
{ _id: '$name',count: { $sum: 1 }, data: { $push: '$$ROOT' } } },
{
$project: {
_id:0,
data:1,
count :1
}
}
}
This is what i did, it works fine.
db.person.aggregate([
{
$group: { _id: '$name'}, // pass the set of field to be grouped
age : { $first: '$age' }, // retain remaining field
count: { $sum: 1 } // count based on your group
},
{
$project:{
name:"$_id.name",
age: "$age",
count: "$count",
_id:0
}
}])
Here is the answer >>>>
$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();
참고URL : https://stackoverflow.com/questions/16662405/mongo-group-query-how-to-keep-fields
반응형
'Programing' 카테고리의 다른 글
단일 호스트 Node.js 프로덕션 앱에 적합한 세션 저장소는 무엇입니까? (0) | 2020.11.10 |
---|---|
Twig에서 어레이의 특정 키가 있는지 확인 (0) | 2020.11.10 |
iOS7의 UIAlertView addSubview (0) | 2020.11.10 |
새로운 색상 드로어 블 만들기 (0) | 2020.11.10 |
ng-if를 ng-repeat 내부의 스위치로 사용합니까? (0) | 2020.11.10 |