微信小程序开发文档 第8页

SDK数据库 Aggregate·限制记录数

Aggregate.limit(value: number): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。限制输出到下一阶段的记录数。 参数 value: number 正整数 返回值 Aggregate 示例 假设集合 items 有如下记录: { _id: "1", price: 10 } { _id: "2", price: 50 } { _id: "3", price: 20 } { _id: "4", price: 80 } { _id: "5", price: 200 } 返回价格大于 20 的记录的最小的两个记录: const $ = db.command.aggregate db.collection('items').aggregate() .match({ price: $.gt(20) }) .sort({ price: 1, }) .limit(2) .end() 返回结果如下: { "_id": "3", "price": 20 } { "_id": "4", "price": 80 }

SDK数据库 Aggregate·记录分组

Aggregate.group(object: Object): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。将输入记录按给定表达式分组,输出时每个记录代表一个分组,每个记录的 _id 是区分不同组的 key。输出记录中也可以包括累计值,将输出字段设为累计值即会从该分组中计算累计值。 参数 object: Object 返回值 Aggregate API 说明 group 的形式如下: group({ _id: <expression>, <field1>: <accumulator1>, ... <fieldN>: <accumulatorN> }) _id 参数是必填的,如果填常量则只有一组。其他字段是可选的,都是累计值,用 $.sum 等累计器,但也可以使用其他表达式。 累计器必须是以下操作符之一: addToSet avg first last max min push stdDevPop stdDevSamp sum 内存限制 该阶段有 100M 内存使用限制。 示例 1:按字段值分组 假设集合 avatar 有如下记录: { _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,...

SDK数据库 Aggregate·从近到远输出

Aggregate.geoNear(options: Object): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。将记录按照离给定点从近到远输出。 参数 options: Object 属性 类型 默认值 必填 说明 near GeoPoint 是 GeoJSON Point,用于判断距离的点 spherical true 是 必填,值为 true limit number 否 限制返回记录数 maxDistance number 否 距离最大值 minDistance number 否 距离最小值 query Object 否 要求记录必须同时满足该条件(语法同 where) distanceMultiplier number 否 返回时在距离上乘以该数字 distanceField string 是 存放距离的输出字段名,可以用点表示法表示一个嵌套字段 includeLocs string 否 列出要用于距离计算的字段,如果记录中有多个字段都是地理位置时有用 key string 否 选择要用的地理位置索引。如果集合由多个地理位置索引,则必须指定一个,指定的方式是指定对应的字段 返回值 Aggregate API 说明 geoNear 必须为第一个聚合阶段 必须有地理位置索引。如果有多个,必须用 key 参数指定要使用的索引。 示例 假设集合 attractions 有如下记录: { "_id": "geoNear.0", "city": "Guangzhou", "docType": "geoNear", "location": { "type": "Point", "coordinates": [ 113.30593, 23.1361155 ] }, "name": "Canton Tower" }, { "_id": "geoNear.1", "city": "Guangzhou", "docType": "geoNear", "location": { "type": "Point", "coordinates": [ 113.306789, 23.1564721 ] }, "name": "Baiyun Mountain" }, { "_id": "geoNear.2", "city": "Beijing", "docType": "geoNear", "location": { "type": "Point", "coordinates": [...

SDK数据库 Aggregate·计算记录数

Aggregate.count(fieldName: string): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。计算上一聚合阶段输入到本阶段的记录数,输出一个记录,其中指定字段的值为记录数。 参数 fieldName: string 返回值 Aggregate API 说明 count 的形式如下: count(<string>) <string> 是输出记录数的字段的名字,不能是空字符串,不能以 $ 开头,不能包含 . 字符。 count 阶段等同于 group + project 的操作: const $ = db.command.aggregate db.collection('items').aggregate() .group({ _id: null, count: $.sum(1), }) .project({ _id: 0, }) .end() 上述操作会输出一个包含 count 字段的记录。 示例 假设集合 items 有如下记录: { _id: "1", price: 10.5 } { _id: "2", price: 50.3 } { _id: "3", price: 20.8 } { _id: "4", price: 80.2 } { _id: "5", price: 200.3 } 找出价格大于 50 的记录数: const $ = db.command.aggregate db.collection('items').aggregate() .match({ price: $.gt(50) }) .count('expensiveCount') .end() 返回结果如下: { "expensiveCount": 3 }

SDK数据库 Aggregate·划分记录

Aggregate.bucketAuto(object:Object): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。将输入记录根据给定的条件划分成不同的组,每组即一个 bucket。与 bucket 的其中一个不同之处在于无需指定 boundaries,bucketAuto 会自动尝试将记录尽可能平均的分散到每组中。 参数 object: Object 返回值 Aggregate API 说明 每组分别作为一个记录输出,包含一个以包含组中最大值和最小值两个字段的对象为值的 _id 字段和一个以组中记录数为值的 count 字段。count 在没有指定 output 的时候是默认输出的。 bucketAuto 的形式如下: bucketAuto({ groupBy: <expression>, buckets: <number>, granularity: <string>, output: { <output1>: <accumulator expr>, ... <outputN>: <accumulator expr> } }) groupBy 是一个用以决定分组的表达式,会应用在各个输入记录上。可以用 $ 前缀加上要用以分组的字段路径来作为表达式。除非用 default 指定了默认值,否则每个记录都需要包含指定的字段,且字段值必须在 boundaries 指定的范围之内。 buckets 是一个用于指定划分组数的正整数。 granularity 是可选枚举值字符串,用于保证自动计算出的边界符合给定的规则。这个字段仅可在所有 groupBy 值都是数字并且没有 NaN 的情况下使用。枚举值包括:R5、R10、R20、R40、R80、1-2-5、E6、E12、E24、E48、E96、E192、POWERSOF2。 output 可选,用以决定输出记录除了 _id 外还要包含哪些字段,各个字段的值必须用累加器表达式指定。当 output 指定时,默认的 count 是不会被默认输出的,必须手动指定: output: { count: $.sum(1), ... <outputN>: <accumulator expr> } 在以下情况中,输出的分组可能会小于给定的组数: 输入记录数少于分组数 groupBy 计算得到的唯一值少于分组数 granularity 的间距少于分组数 granularity 不够精细以至于不能平均分配到各组 granularity 详细说明 granularity 用于保证边界值属于一个给定的数字序列。 Renard 序列 Renard 序列是以 10 的 5 / 10 / 20 / 40 / 80 次方根来推导的、在 1.0 到 10.0 (如果是 R80 则是 10.3) 之间的数字序列。 设置 granularity 为 R5 / R10 / R20 / R40 / R80 就把边界值限定在序列内。如果 groupBy 的值不在 1.0 到 10.0 (如果是 R80 则是 10.3) 内,则序列数字会自动乘以 10。 E 序列 E 序列是以 10 的 6 / 12 / 24 / 48 / 96 / 192 次方跟来推导的、带有一个特定误差的、在 1.0 到 10.0 之间的数字序列。 1-2-5...

SDK数据库 Aggregate·划分输入数据

Aggregate.bucket(object: Object): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。将输入记录根据给定的条件和边界划分成不同的组,每组即一个 bucket。 参数 object: Object 返回值 Aggregate API 说明 每组分别作为一个记录输出,包含一个以下界为值的 _id 字段和一个以组中记录数为值的 count 字段。count 在没有指定 output 的时候是默认输出的。 bucket 只会在组内有至少一个记录的时候输出。 bucket 的形式如下: bucket({ groupBy: <expression>, boundaries: [<lowerbound1>, <lowerbound2>, ...], default: <literal>, output: { <output1>: <accumulator expr>, ... <outputN>: <accumulator expr> } }) groupBy 是一个用以决定分组的表达式,会应用在各个输入记录上。可以用 $ 前缀加上要用以分组的字段路径来作为表达式。除非用 default 指定了默认值,否则每个记录都需要包含指定的字段,且字段值必须在 boundaries 指定的范围之内。 boundaries 是一个数组,每个元素分别是每组的下界。必须至少指定两个边界值。数组值必须是同类型递增的值。 default 可选,指定之后,没有进入任何分组的记录将都进入一个默认分组,这个分组记录的 _id 即由 default 决定。default 的值必须小于 boundaries 中的最小值或大于等于其中的最大值。default 的值可以与 boundaries 元素值类型不同。 output 可选,用以决定输出记录除了 _id 外还要包含哪些字段,各个字段的值必须用累加器表达式指定。当 output 指定时,默认的 count 是不会被默认输出的,必须手动指定: output: { count: $.sum(1), ... <outputN>: <accumulator expr> } 使用 bucket 需要满足以下至少一个条件,否则会抛出错误: 每一个输入记录应用 groupBy 表达式获取的值都必须是一个在 boundaries 内的值 指定一个 default 值,该值在 boundaries 以外,或与 boundaries 元素的值不同的类型。 示例 假设集合 items 有如下记录: { _id: "1", price: 10 } { _id: "2", price: 50 } { _id: "3", price: 20 } { _id: "4", price: 80 } { _id: "5", price: 200 } 对上述记录进行分组,将 [0, 50) 分为一组,[50, 100) 分为一组,其他分为一组: const $ = db.command.aggregate db.collection('items').aggregate() .bucket({ groupBy: '$price', boundaries: [0, 50, 100], default: 'other', output: { count: $.sum(1), ids: $.push('$_id') } }) .end() 返回结果如下: [ { "_id": 0, "count": 2,...

SDK数据库 Aggregate·添加记录

Aggregate.addFields(object: Object): Aggregate 支持端:小程序 2.7.4, 云函数 0.8.1, Web 聚合阶段。添加新字段到输出的记录。经过 addFields 聚合阶段,输出的所有记录中除了输入时带有的字段外,还将带有 addFields 指定的字段。 参数 object: Object 返回值 Aggregate API 说明 addFields 等同于同时指定了所有已有字段和新增字段的 project 阶段。 addFields 的形式如下: addFields({ <新字段>: <表达式> }) addFields 可指定多个新字段,每个新字段的值由使用的表达式决定。 如果指定的新字段与原有字段重名,则新字段的值会覆盖原有字段的值。注意 addFields 不能用来给数组字段添加元素。 示例 1:连续两次 addFields 假设集合 scores 有如下记录: { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 } { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 } 应用两次 addFields,第一次增加两个字段分别为 homework 和 quiz 的和值,第二次增加一个字段再基于上两个和值求一次和值。 const $ = db.command.aggregate db.collection('scores').aggregate() .addFields({ totalHomework: $.sum('$homework'), totalQuiz: $.sum('$quiz') }) .addFields({ totalScore: $.add(['$totalHomework', '$totalQuiz', '$extraCredit']) }) .end() 返回结果如下: { "_id" : 1, "student" : "Maya", "homework" : [ 10, 5, 10 ], "quiz" : [ 10, 8 ], "extraCredit" : 0, "totalHomework" : 25, "totalQuiz" : 18, "totalScore" : 43 } { "_id" : 2,...

SDK数据库 Document

Document 数据库记录引用 方法: Document.get(): Promise<Object> 支持端:小程序 , 云函数 , Web 获取记录数据,或获取根据查询条件筛选后的记录数据 返回值 Promise.<Object> 属性 类型 说明 data Object 查询的记录数据 注意事项 默认情况下,如果获取不到记录,方法会抛出异常,建议设置为返回空而不是抛出异常,设置方法为在初始化 db 对象时设置 throwOnNotFound 为 false: const db = cloud.database({ throwOnNotFound: false }) 目前仅在云函数 wx-server-sdk 1.7.0 或以上支持 示例代码 获取我的指定待办事项详细信息 小程序端 const db = wx.cloud.database() db.collection('todos').doc('<some-todo-id>').get().then(res => { console.log(res.data) }) 云函数端 const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() exports.main = async (event, context) => { try { return await db.collection('todos').doc('<some-todo-id>').get() } catch(e) { console.error(e) } } 小程序端兼容支持回调风格 const db = wx.cloud.database() db.collection('todos').doc('<some-todo-id>').get({ success: function(res) { console.log(res.data) }, fail: console.error }) Document.set(options: Object): Promise<Object> 支持端:小程序 , 云函数 , Web 替换更新一条记录 参数 options: Object 属性 类型 默认值 必填 说明 data Object 是 替换记录的定义 返回值 Promise.<Object> 属性 类型 说明 _id number/string 记录 _id stats Object 更新结果的统计,其中包含的字段见下方 stats 的定义 stats 的结构 属性 类型...

SDK数据库 Collection·请求

Collection.get(): Promise<Object> 支持端:小程序 , 云函数 , Web 获取集合数据,或获取根据查询条件筛选后的集合数据。 返回值 Promise.<Object> 属性 类型 说明 data Array.<Object> 查询的结果数组,数据的每个元素是一个 Object,代表一条记录 使用说明 统计集合记录数或统计查询语句对应的结果记录数 小程序端与云函数端的表现会有如下差异: 小程序端:如果没有指定 limit,则默认且最多取 20 条记录。 云函数端:如果没有指定 limit,则默认且最多取 100 条记录。 如果没有指定 skip,则默认从第 0 条记录开始取,skip 常用于分页,例子可见第二个示例代码。 如果需要取集合中所有的数据,仅在数据量不大且在云函数中时,可以参考云函数使用示例中的第三个示例代码 示例代码 1 获取我的待办事项清单: 小程序端 const db = wx.cloud.database() db.collection('todos').where({ _openid: 'xxx' // 填入当前用户 openid }).get().then(res => { console.log(res.data) }) 云函数端 const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() exports.main = async (event, context) => { return await db.collection('todos').where({ _openid: 'xxx' // 填入当前用户 openid }).get() } 示例代码 2:分页取数据 获取我的第二页的待办事项清单,假设一页 10 条,现在要取第 2 页,则可以指定 skip 10 条记录 db.collection('todos') .where({ _openid: 'xxx', // 填入当前用户 openid }) .skip(10) // 跳过结果集中的前 10 条,从第 11 条开始返回 .limit(10) // 限制返回数量为 10 条 .get() .then(res => { console.log(res.data) }) .catch(err => { console.error(err) }) 示例代码 3:取集合所有数据 获取集合中的所有待办事项清单:因为有默认 limit 100...

SDK数据库 Collection·构建查询条件

Collection.where(condition: Object): Collection 支持端:小程序 , 云函数 , Web 指定查询条件,返回带新查询条件的新的集合引用 参数 condition: Object 查询条件 返回值 Collection 示例代码 const _ = db.command const result = await db.collection('todos').where({ price: _.lt(100) }).get() Collection.limit(value: number): Collection 支持端:小程序 , 云函数 , Web 指定查询结果集数量上限 参数 value: number 返回值 Collection 说明 limit 在小程序端默认及最大上限为 20,在云函数端默认及最大上限为 1000 示例代码 db.collection('todos').limit(10) .get() .then(console.log) .catch(console.error) Collection.orderBy(fieldPath: string, string: order): Collection 支持端:小程序 , 云函数 , Web 指定查询排序条件 参数 fieldPath: string string: order 返回值 Collection 说明 方法接受一个必填字符串参数 fieldName 用于定义需要排序的字段,一个字符串参数 order 定义排序顺序。order 只能取 asc 或 desc。 如果需要对嵌套字段排序,需要用 “点表示法” 连接嵌套字段,比如 style.color 表示字段 style 里的嵌套字段 color。 同时也支持按多个字段排序,多次调用 orderBy 即可,多字段排序时的顺序会按照 orderBy 调用顺序先后对多个字段排序 示例代码:按一个字段排序 按进度排升序取待办事项 db.collection('todos').orderBy('progress', 'asc') .get() .then(console.log) .catch(console.error) 示例代码:按多个字段排序 先按 progress 排降序(progress 越大越靠前)、再按 description 排升序(字母序越前越靠前)取待办事项: db.collection('todos') .orderBy('progress', 'desc') .orderBy('description', 'asc') .get() .then(console.log) .catch(console.error) Collection.skip(offset: number): Collection 支持端:小程序 , 云函数 , Web 指定查询返回结果时从指定序列后的结果开始返回,常用于分页 参数 offset: number 返回值 Collection 示例代码 db.collection('todos').skip(10) .get() .then(console.log) .catch(console.error) Collection.field(projection: Object): Collection 支持端:小程序 , 云函数 , Web 指定返回结果中记录需返回的字段 参数 projection: Object 返回值 Collection 说明 方法接受一个必填对象用于指定需返回的字段,对象的各个 key 表示要返回或不要返回的字段,value 传入 true|false(或 1|-1)表示要返回还是不要返回。 示例代码 只返回 description,...