123

みんな。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
}
]
4

12 に答える 12

264

各グループの最初に一致したエントリに関する情報を保持したい場合は、次のように集計してみてください。

    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 },
      }
    }]);
于 2013-05-21T05:40:13.970 に答える
6

多数のフィールドを持つドキュメントで同じ問題に直面した場合は、簡単に更新してください。$replaceRootパイプライン ステージと$mergeObjectsパイプライン オペレーターを組み合わせて使用​​することができます。

db.users.aggregate([
  {
    $group: {
      _id: '$name',
      user: { $first: '$$ROOT' },
      count: { $sum: 1 }
    },
  },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: [{ count: '$count' }, '$user'] }
    }
  }
])
于 2020-03-03T17:19:19.917 に答える
1

.groupヘルパーについては知りませんでしたが、 Aggregation Frameworkを使用する場合は、返すフィールドを指定する必要があります。私が間違っている場合は修正してください。ただし、SQL ではとにかくそれを行う必要があります。

さて、これは、前述の集約フレームワークでそれを行う方法です。

db.test.aggregate({
  $group: {
    _id: { name: "$name", city: "$city", fieldName: "$fieldName" },
    count: { $sum: 1 }
  }
})
于 2013-05-21T05:12:32.257 に答える