codecamp

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 }


SDK数据库 Command·聚合操作符·字符串操作符
SDK数据库 Command·聚合操作符·变量操作符
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

微信小程序 指南

目录结构

开放能力

微信小程序 调试

微信小程序 实时日志

微信小程序 小程序测速

微信小程序 基础组件

微信小程序 API

媒体

界面

微信小程序API 绘图

微信小程序 服务端

接口调用凭证

统一服务消息

微信小程序 服务市场

微信小程序 生物认证

微信小程序 云开发

服务端

微信小程序云开发服务端API 数据库

SDK文档

微信小程序 扩展能力

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }