Blogger Information
Blog 25
fans 0
comment 0
visits 42067
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
两种方法读出云数据库里所有记录
程先生的博客
Original
1696 people have browsed it

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

云函数端获取一个集合所有记录的例子,因为有最多一次取 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();
	},

运行实例 »

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


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post