Aggregate.group(object: Object): Aggregate

支持端:小程序 2.7.4, 云函数 0.8.1, Web

聚合阶段。将输入记录按给定表达式分组,输出时每个记录代表一个分组,每个记录的 _id 是区分不同组的 key。输出记录中也可以包括累计值,将输出字段设为累计值即会从该分组中计算累计值。

参数

object: Object

返回值

Aggregate

API 说明

group 的形式如下:

  1. group({
  2. _id: <expression>,
  3. <field1>: <accumulator1>,
  4. ...
  5. <fieldN>: <accumulatorN>
  6. })

_id 参数是必填的,如果填常量则只有一组。其他字段是可选的,都是累计值,用 $.sum 等累计器,但也可以使用其他表达式。

累计器必须是以下操作符之一:

  • addToSet
  • avg
  • first
  • last
  • max
  • min
  • push
  • stdDevPop
  • stdDevSamp
  • sum

内存限制

该阶段有 100M 内存使用限制。

示例 1:按字段值分组

假设集合 avatar 有如下记录:

  1. {
  2. _id: "1",
  3. alias: "john",
  4. region: "asia",
  5. scores: [40, 20, 80],
  6. coins: 100
  7. }
  8. {
  9. _id: "2",
  10. alias: "arthur",
  11. region: "europe",
  12. scores: [60, 90],
  13. coins: 20
  14. }
  15. {
  16. _id: "3",
  17. alias: "george",
  18. region: "europe",
  19. scores: [50, 70, 90],
  20. coins: 50
  21. }
  22. {
  23. _id: "4",
  24. alias: "john",
  25. region: "asia",
  26. scores: [30, 60, 100, 90],
  27. coins: 40
  28. }
  29. {
  30. _id: "5",
  31. alias: "george",
  32. region: "europe",
  33. scores: [20],
  34. coins: 60
  35. }
  36. {
  37. _id: "6",
  38. alias: "john",
  39. region: "asia",
  40. scores: [40, 80, 70],
  41. coins: 120
  42. }
  1. const $ = db.command.aggregate
  2. db.collection('avatar').aggregate()
  3. .group({
  4. _id: '$alias',
  5. num: $.sum(1)
  6. })
  7. .end()

返回结果如下:

  1. {
  2. "_id": "john",
  3. "num": 3
  4. }
  5. {
  6. "_id": "authur",
  7. "num": 1
  8. }
  9. {
  10. "_id": "george",
  11. "num": 2
  12. }

示例 2:按多个值分组

可以给 _id 传入记录的方式按多个值分组。还是沿用上面的示例数据,按各个区域(region)获得相同最高分(score)的来分组,并求出各组虚拟币(coins)的总量:

  1. const $ = db.command.aggregate
  2. db.collection('avatar').aggregate()
  3. .group({
  4. _id: {
  5. region: '$region',
  6. maxScore: $.max('$scores')
  7. },
  8. totalCoins: $.sum('$coins')
  9. })
  10. .end()

返回结果如下:

  1. {
  2. "_id": {
  3. "region": "asia",
  4. "maxScore": 80
  5. },
  6. "totalCoins": 220
  7. }
  8. {
  9. "_id": {
  10. "region": "asia",
  11. "maxScore": 100
  12. },
  13. "totalCoins": 100
  14. }
  15. {
  16. "_id": {
  17. "region": "europe",
  18. "maxScore": 90
  19. },
  20. "totalCoins": 70
  21. }
  22. {
  23. "_id": {
  24. "region": "europe",
  25. "maxScore": 20
  26. },
  27. "totalCoins": 60
  28. }