// 1. 数据库数据
// {
// "avatar": { // 集合(表名)
// "data": [ // 数据
// {
// "_id": "1",
// "alias": "john",
// "region": "asia",
// "scores": [40, 20, 80],
// "coins": 100
// },
// {
// "_id": "2",
// "alias": "arthur",
// "region": "europe",
// "scores": [60, 90],
// "coins": 20
// },
// {
// "_id": "3",
// "alias": "george",
// "region": "europe",
// "scores": [50, 70, 90],
// "coins": 50
// },
// {
// "_id": "4",
// "alias": "john",
// "region": "asia",
// "scores": [30, 60, 100, 90],
// "coins": 40
// },
// {
// "_id": "5",
// "alias": "george",
// "region": "europe",
// "scores": [20],
// "coins": 60
// },
// {
// "_id": "6",
// "alias": "john",
// "region": "asia",
// "scores": [40, 80, 70],
// "coins": 120
// }
// ]
// }
// }
// 02. 聚合操作 group
// 聚合阶段,将输入记录按给定表达式分组,输出时每个记录代表一个分组,每个记录的 _id 是区分不同组的 key。
// 输出记录中也可以包括累计值,将输出字段设为累计值即会从该分组中计算累计值。
‘use strict‘;
const db = uniCloud.database();
const $ = db.command.aggregate;
exports.main = async(event, context) => {
let res = await db.collection(‘avatar‘).aggregate()
// 按多个值分组
// 按各个区域(region)获得相同最高分(score)的来分组,并求出各组虚拟币(coins)的总量:
// 如果没有相同最高分的组,则单独为一组
.group({
// 第一个字段 _id
_id: {
region: ‘$region‘,
maxScore: $.max(‘$scores‘)
},
// 第二个字段: totalCoins
totalCoins: $.sum(‘$coins‘)
})
.end();
return res;
};
// 聚合之后的返回值
// {
// "affectedDocs": 4,
// "data": [{
// "_id": {
// "maxScore": 20, // "_id": "5",
// "region": "europe"
// },
// "totalCoins": 60
// },
// {
// "_id": {
// "maxScore": 100, // "_id": "4",
// "region": "asia"
// },
// "totalCoins": 40
// },
// {
// "_id": {
// "maxScore": 90, // "_id": "3" + "_id": "2" maxScore 相同
// "region": "europe"
// },
// "totalCoins": 70 // totalCoins相加 20 + 50
// },
// {
// "_id": {
// "maxScore": 80, // "_id": "1" + "_id": "6",
// "region": "asia"
// },
// "totalCoins": 220 // 100 + 120
// }
// ]
// }