[mongodb] 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 }
  }
}


답변

[댓글 제안을 포함하도록 수정 됨]

나는 답을 찾기 위해 여기에 왔지만 선택한 답변에 만족하지 않았습니다 (특히 나이를 감안할 때). 더 나은 솔루션 (적응) 이 답변 을 찾았습니다 .

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