각자 모두. 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 }
}
}
답변
[댓글 제안을 포함하도록 수정 됨]
나는 답을 찾기 위해 여기에 왔지만 선택한 답변에 만족하지 않았습니다 (특히 나이를 감안할 때). 더 나은 솔루션 (적응) 이 답변 을 찾았습니다 .
db.test.aggregate({
$group: {
_id: '$name',
person: { "$first": "$$ROOT" },
count: { $sum: 1 }
},
{
"$replaceRoot": { "newRoot": { "$mergeObjects": ["$person", { count: "$count" }]} }
}
}
답변
당신은 이것을 시도 할 수 있습니다
db.test.aggregate({
{ $group:
{ _id: '$name',count: { $sum: 1 }, data: { $push: '$$ROOT' } } },
{
$project: {
_id:0,
data:1,
count :1
}
}
}
답변
이것은 내가 한 일이며 잘 작동합니다.
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
}
}])
답변
필드가 많은 문서에서 동일한 문제가 발생하면 빠른 업데이트입니다. $replaceRoot
파이프 라인 단계와 $mergeObjects
파이프 라인 연산자 를 결합하는 힘을 사용할 수 있습니다 .
db.users.aggregate([
{
$group: {
_id: '$name',
user: { $first: '$$ROOT' },
count: { $sum: 1 }
},
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [{ count: '$count' }, '$user'] }
}
}
])
답변
사용 $first
으로 $$ROOT
문서를 누른 후 $replaceRoot
첫 번째 필드로.
db.test.aggregate([
{ "$group": {
"_id": "$name",
"doc": { "$first": "$$ROOT" }
}},
{ "$replaceRoot": { "newRoot": "$doc" }}
])