搜索
博主信息
博文 25
粉丝 0
评论 0
访问量 49397
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
两种方法读出云数据库里所有记录
程先生的博客
原创
2075人浏览过

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

云函数端获取一个集合所有记录的例子,因为有最多一次取 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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学