博客列表 >两种方法读出云数据库里所有记录

两种方法读出云数据库里所有记录

程先生的博客
程先生的博客原创
2019年08月20日 21:32:151698浏览

一、使用云函数读取集合的所有记录

云函数端获取一个集合所有记录的例子,因为有最多一次取 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取:

实例

const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const MAX_LIMIT = 100
exports.main = async (event, context) => {
  // 先取出集合记录总数
  const countResult = await db.collection('todos').count()
  const total = countResult.total
  // 计算需分几次取
  const batchTimes = Math.ceil(total / 100)
  // 承载所有读操作的 promise 的数组
  const tasks = []
  for (let i = 0; i < batchTimes; i++) {
    const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise)
  }
  // 等待所有
  return (await Promise.all(tasks)).reduce((acc, cur) => {
    return {
      data: acc.data.concat(cur.data),
      errMsg: acc.errMsg,
    }
  })
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

思路:分批取出记录,把get()查询返回的promise存入数组,利用reduce方法返回链接的所有记录

核心函数: reduce({function}) 参数是一个函数,依次作用于数组的相邻item,最终返回一个数据。可以返回累计值,比较出最大值等

Promise.all(iterable);参数:iterable一个可迭代对象,如 Array 或 String。

返回值:

如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise。

如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise。

其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定

此方法在集合多个 promise 的返回结果时很有用。

二、使用小程序端API读取集合的所有记录

在page的data中初始化空数组,后续按读取循环次数链接新老数据,得到所有记录

核心代码如下:

实例

 db.collection('food').where({ 查询条件 }).count().then(res => {
      var total = res.total
      // 计算需分几次取
      const batchTimes = Math.ceil(total / 20)
      for (let i = 0; i < batchTimes; i++) {
        db.collection('food').skip(i * 20).limit(20).where({ 查询条件 }).get().then(res => {
          let new_data = res.data
          let old_data = this.data.category
          this.setData({
            category : old_data.concat(new_data)
          })
        })
      }
    })

运行实例 »

点击 "运行实例" 按钮查看在线实例

实战案例:

第二种方法应用在具体的小程序思路:

加载模块: 注意查询语句要用skip(that.data.page_index * page_size)跳过分页加载,否则一直循环加载前20个记录

实例

loadOrder: function () {
		var page_size = 20;
    db.collection('order').limit(page_size).skip(that.data.page_index * page_size).get().then(res => {
				// 请求成功将数据存入orderList
				that.setData({
					orderList: that.data.page_index == 0 ? res.data : that.data.orderList.concat(res.data)
				});
				// 判断上拉加载状态
				if (res.length < page_size && that.data.page_index != 0) {
					that.setData({
						loadingTip: '没有更多内容'
					});
				}
				// holder
				that.setData({
					visual: res.length == 0 && that.data.page_index == 0 ? 'show' : 'hidden'
				});
			}, function(error) {
				alert("查询失败: " + error.code + " " + error.message);
			});
	},

运行实例 »

点击 "运行实例" 按钮查看在线实例

在触底加载模块调用加载模块,并把页数加1,记录的this.data中

实例

onReachBottom: function () {
		that.setData({
			page_index: ++that.data.page_index
		});
		that.loadOrder();
	},

运行实例 »

点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议