SDK数据库 Command·聚合操作符·累记器操作符
AggregateCommand.addToSet(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。聚合运算符。向数组中添加值,如果数组中已存在该值,不执行任何操作。它只能在 group stage 中使用。
参数
value: Expression
表达式
返回值
Object
API 说明
addToSet 语法如下:
db.command.aggregate.addToSet(<表达式>)
表达式是形如 $ + 指定字段 的字符串。如果指定字段的值是数组,那么整个数组会被当作一个元素。
示例代码
假设集合 passages 的记录如下:
{ "category": "web", "tags": [ "JavaScript", "CSS" ], "title": "title1" }
{ "category": "System", "tags": [ "C++", "C" ], "title": "title2" }
非数组字段
每条记录的 category 对应值的类型是非数组,利用 addToSet 统计所有分类:
const $ = db.command.aggregate
db
.collection('passages')
.aggregate()
.group({
_id: null,
categories: $.addToSet('$category')
})
.end()
返回的结果如下:
{ "_id": null, "categories": [ "System", "web" ] }
数组字段
每条记录的 tags 对应值的类型是数组,数组不会被自动展开:
const $ = db.command.aggregate
db
.collection('passages')
.aggregate()
.group({
_id: null,
tagsList: $.addToSet('$tags')
})
.end()
返回的结果如下:
{ "_id": null, "tagsList": [ [ "C++", "C" ], [ "JavaScript", "CSS" ] ] }
AggregateCommand.avg(value: Expression<number>): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。返回一组集合中,指定字段对应数据的平均值。
参数
value: Expression<number>
number
返回值
Object
API 说明
avg 的语法如下:
db.command.aggregate.avg(<number>)
avg 传入的值除了数字常量外,也可以是任何最终解析成一个数字的表达式。它会忽略非数字值。
示例代码
假设集合 students 的记录如下:
{ "group": "a", "name": "stu1", "score": 84 }
{ "group": "a", "name": "stu2", "score": 96 }
{ "group": "b", "name": "stu3", "score": 80 }
{ "group": "b", "name": "stu4", "score": 100 }
借助 avg 可以计算所有记录的 score 的平均值:
const $ = db.command.aggregate
db
.collection('students')
.aggregate()
.group({
_id: null,
average: $.avg('$score')
})
.end()
返回的结果如下:
{ "_id": null, "average": 90 }
AggregateCommand.first(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。返回指定字段在一组集合的第一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义。
参数
value: Expression
表达式
返回值
Object
API 说明
first 的语法如下:
db.command.aggregate.first(<表达式>)
表达式是形如 $ + 指定字段 的字符串。
first 只能在 group 阶段被使用,并且需要配合 sort 才有意义。
示例代码
假设集合 students 的记录如下:
{ "group": "a", "name": "stu1", "score": 84 }
{ "group": "a", "name": "stu2", "score": 96 }
{ "group": "b", "name": "stu3", "score": 80 }
{ "group": "b", "name": "stu4", "score": 100 }
如果需要得到所有记录中 score 的最小值,可以先将所有记录按照 score 排序,然后取出第一条记录的 first。
const $ = db.command.aggregate
db
.collection('students')
.aggregate()
.sort({
score: 1
})
.group({
_id: null,
min: $.first('$score')
})
.end()
返回的数据结果如下:
{ "_id": null, "min": 80 }
AggregateCommand.last(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。返回指定字段在一组集合的最后一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义。
参数
value: Expression
表达式
返回值
Object
API 说明
last 的语法如下:
db.command.aggregate.last(<表达式>)
表达式是形如 $ + 指定字段 的字符串。
last 只能在 group 阶段被使用,并且需要配合 sort 才有意义。
示例代码
假设集合 students 的记录如下:
{ "group": "a", "name": "stu1", "score": 84 }
{ "group": "a", "name": "stu2", "score": 96 }
{ "group": "b", "name": "stu3", "score": 80 }
{ "group": "b", "name": "stu4", "score": 100 }
如果需要得到所有记录中 score 的最大值,可以先将所有记录按照 score 排序,然后取出最后一条记录的 last。
const $ = db.command.aggregate
db
.collection('students')
.aggregate()
.sort({
score: 1
})
.group({
_id: null,
max: $.last('$score')
})
.end()
返回的数据结果如下:
{ "_id": null, "max": 100 }
AggregateCommand.max(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。返回一组数值的最大值。
参数
value: Expression
表达式
返回值
Object
API 说明
max 的语法如下:
db.command.aggregate.max(<表达式>)
表达式是形如 $ + 指定字段 的字符串。
示例代码
假设集合 students 的记录如下:
{ "group": "a", "name": "stu1", "score": 84 }
{ "group": "a", "name": "stu2", "score": 96 }
{ "group": "b", "name": "stu3", "score": 80 }
{ "group": "b", "name": "stu4", "score": 100 }
借助 max 可以统计不同组( group )中成绩的最高值,代码如下:
const $ = db.command.aggregate
db
.collection('students')
.aggregate()
.group({
_id: '$group',
maxScore: $.max('$score')
})
.end()
返回的数据结果如下:
{ "_id": "b", "maxScore": 100 }
{ "_id": "a", "maxScore": 96 }
```.
AggregateCommand.mergeObjects(value: Expression<document>): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。将多个文档合并为单个文档。
参数
value: Expression<document>
Document 表达式
返回值
Object
API 说明
使用形式如下: 在 group() 中使用时:
mergeObjects(<document>)
在其它表达式中使用时:
mergeObjects([<document1>, <document2>, ...])
示例代码
搭配 group() 使用
假设集合 sales 存在以下文档:
{ "_id": 1, "year": 2018, "name": "A", "volume": { "2018Q1": 500, "2018Q2": 500 } }
{ "_id": 2, "year": 2017, "name": "A", "volume": { "2017Q1": 400, "2017Q2": 300, "2017Q3": 0, "2017Q4": 0 } }
{ "_id": 3, "year": 2018, "name": "B", "volume": { "2018Q1": 100 } }
{ "_id": 4, "year": 2017, "name": "B", "volume": { "2017Q3": 100, "2017Q4": 250 } }
下面的代码使用 mergeObjects(),将用相同 name 的文档合并:
const $ = db.command.aggregate
db.collection('sales').aggregate()
.group({
_id: '$name',
mergedVolume: $.mergeObjects('$volume')
})
.end()
输出如下:
{ "_id": "A", "mergedVolume": { "2017Q1": 400, "2017Q2": 300, "2017Q3": 0, "2017Q4": 0, "2018Q1": 500, "2018Q2": 500 } }
{ "_id": "B", "mergedVolume": { "2017Q3": 100, "2017Q4": 250, "2018Q1": 100 } }
一般用法
假设集合 test 存在以下文档:
{ "_id": 1, "foo": { "a": 1 }, "bar": { "b": 2 } }
{ "_id": 2, "foo": { "c": 1 }, "bar": { "d": 2 } }
{ "_id": 3, "foo": { "e": 1 }, "bar": { "f": 2 } }
下面的代码使用 mergeObjects(),将文档中的 foo 和 bar 字段合并为 foobar:
const $ = db.command.aggregate
db.collection('sales').aggregate()
.project({
foobar: $.mergeObjects(['$foo', '$bar'])
})
.end()
输出结果如下:
{ "_id": 1, "foobar": { "a": 1, "b": 2 } }
{ "_id": 2, "foobar": { "c": 1, "d": 2 } }
{ "_id": 3, "foobar": { "e": 1, "f": 2 } }
AggregateCommand.min(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。返回一组数值的最小值。
参数
value: Expression
表达式
返回值
Object
API 说明
min 的语法如下:
db.command.aggregate.min(<表达式>)
表达式是形如 $ + 指定字段 的字符串。
示例代码
假设集合 students 的记录如下:
{ "group": "a", "name": "stu1", "score": 84 }
{ "group": "a", "name": "stu2", "score": 96 }
{ "group": "b", "name": "stu3", "score": 80 }
{ "group": "b", "name": "stu4", "score": 100 }
借助 min 可以统计不同组( group )中成绩的最低值,代码如下:
const $ = db.command.aggregate
db
.collection('students')
.aggregate()
.group({
_id: '$group',
minScore: $.min('$score')
})
.end()
返回的数据结果如下:
{ "_id": "b", "minScore": 80 }
{ "_id": "a", "minScore": 84 }
AggregateCommand.push(value: any): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。在 group 阶段,返回一组中表达式指定列与对应的值,一起组成的数组。
参数
value: any
返回值
Object
API 说明
push 语法如下:
db.command.aggregate.push({
<字段名1>: <指定字段1>,
<字段名2>: <指定字段2>,
...
})
示例代码
假设集合 students 的记录如下:
{ "group": "a", "name": "stu1", "score": 84 }
{ "group": "a", "name": "stu2", "score": 96 }
{ "group": "b", "name": "stu3", "score": 80 }
{ "group": "b", "name": "stu4", "score": 100 }
借助 push 操作,对不同分组( group )的所有记录,聚合所有数据并且将其放入一个新的字段中,进一步结构化和语义化数据。
const $ = db.command.aggregate
db
.collection('students')
.aggregate()
.group({
_id: '$group',
students: $.push({
name: '$name',
score: '$score'
})
})
.end()
输出结果如下:
{ "_id": "b", "students": [{ "name": "stu3", "score": 80 }, { "name": "stu4", "score": 100 }] }
{ "_id": "a", "students": [{ "name": "stu1", "score": 84 }, { "name": "stu2", "score": 96 }] }
AggregateCommand.stdDevPop(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。返回一组字段对应值的标准差。
参数
value: Expression
表达式
返回值
Object
API 说明
stdDevPop 的使用形式如下:
db.command.aggregate.stdDevPop(<表达式>)
表达式传入的是指定字段,指定字段对应的值的数据类型必须是 number ,否则结果会返回 null。
示例代码
假设集合 students 的记录如下:a 组同学的成绩分别是84和96,b组同学的成绩分别是80和100。
{ "group":"a", "score":84 }
{ "group":"a", "score":96 }
{ "group":"b", "score":80 }
{ "group":"b", "score":100 }
可以用 stdDevPop 来分别计算 a 和 b 两组同学成绩的标准差,以此来比较哪一组同学的成绩更稳定。代码如下:
const $ = db.command.aggregate
db.collection('students').aggregate()
.group({
_id: '$group',
stdDev: $.stdDevPop('$score')
})
.end()
返回的数据结果如下:
{ "_id": "b", "stdDev": 10 }
{ "_id": "a", "stdDev": 6 }
AggregateCommand.stdDevSamp(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。计算输入值的样本标准偏差。如果输入值代表数据总体,或者不概括更多的数据,请改用 db.command.aggregate.stdDevPop。
参数
value: Expression
表达式
返回值
Object
API 说明
stdDevSamp 的使用形式如下:
db.command.aggregate.stdDevSamp(<表达式>)
表达式传入的是指定字段,stdDevSamp 会自动忽略非数字值。如果指定字段所有的值均是非数字,那么结果返回 null。
示例代码
假设集合 students 的记录如下:
{ "score": 80 }
{ "score": 100 }
可以用 stdDevSamp 来计算成绩的标准样本偏差。代码如下:
const $ = db.command.aggregate
db.collection('students').aggregate()
.group({
_id: null,
ageStdDev: $.stdDevSamp('$score')
})
.end()
返回的数据结果如下:
{ "_id": null, "ageStdDev": 14.142135623730951 }
如果向集合 students 添加一条新记录,它的 score 字段类型是 string:
{ "score": "aa" }
用上面代码计算标准样本偏差时,stdDevSamp 会自动忽略类型不为 number 的记录,返回结果保持不变。
AggregateCommand.sum(value: Expression): Object
支持端:小程序 2.7.4, 云函数 0.8.1, Web
聚合操作符。计算并且返回一组字段所有数值的总和。
参数
value: Expression
表达式
返回值
Object
API 说明
sum 的使用形式如下:
db.command.aggregate.sum(<表达式>)
表达式可以传入指定字段,也可以传入指定字段组成的列表。sum 会自动忽略非数字值。如果字段下的所有值均是非数字,那么结果返回 0。若传入数字常量,则当做所有记录该字段的值都给给定常量,在聚合时相加,最终值为输入记录数乘以常量。
示例代码
假设代表商品的集合 goods 的记录如下:price 代表商品销售额,cost 代表商品成本
{ "cost": -10, "price": 100 }
{ "cost": -15, "price": 1 }
{ "cost": -10, "price": 10 }
单独字段
借助 sum 可以计算所有商品的销售总和,代码如下:
const $ = db.command.aggregate
db
.collection('goods')
.aggregate()
.group({
_id: null,
totalPrice: $.sum('$price')
})
.end()
返回的数据结果如下:销售额是 111
{ "_id": null, "totalPrice": 111 }
字段列表
如果需要计算所有商品的利润总额,那么需要将每条记录的 cost 和 price 相加得到此记录对应商品的利润。最后再计算所有商品的利润总额。
借助 sum,代码如下:
const $ = db.command.aggregate
db
.collection('goods')
.aggregate()
.group({
_id: null,
totalProfit: $.sum(
$.sum(['$price', '$cost'])
)
})
.end()
返回的数据结果如下:利润总额为 76
{ "_id": null, "totalProfit": 76 }
更多建议: