前言

在云开发中,小程序端获取一个集合所有记录的操作只能一次获取20条,而云函数端也只能一次获取100条,两种方法都不能真正实现获取一个集合中的所有记录,因此可以通过分批读取实现获取所有记录。


一、云函数分页读取集合中的记录

假设每页大小不超过100,示例代码如下:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database()
const MAX_LIMIT = 20 //分页的大小
// 云函数入口函数
exports.main = async (event, context) => {
  var i = event.i; //获取页号:1,2,3,...
   
  try {
    return  db.collection('todos').skip((i-1) * MAX_LIMIT).limit(MAX_LIMIT).get()
  } catch (e) {
    console.error(e)
  }
}

二、云函数分页获取一个集合所有记录

示例代码如下:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database()
const MAX_LIMIT = 100
// 云函数入口函数
exports.main = async (event, context) => {
  // 先取出集合记录总数
  const count = await db.collection('todos').count()
  const total = count.total
  // 计算需分几次取
  const n = Math.ceil(total / 100)
  // 承载所有读操作的 promise 的数组
  const tasks = []
  for (let i = 0; i < n; 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,
    }
  })
}

总结

获取一个集合中的所有记录是基于分页(分批)读取的思想,在分页的读取的结果上拼接就可获得整个集合的记录了

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐