// 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 // } // ] // }