首页 小程序 小程序 | 云数据库的条件查询

小程序 | 云数据库的条件查询

1.1. 查询单条数据

我们先来看看如何获取一个记录的数据,假设我们已有一个_idtodo-identifiant-aleatoire的在集合todos上的记录,那么我们可以通过在该记录的引用调用 get 方法获取这个待办事项的数据:

  1. db.collection('todos').doc('todo-identifiant-aleatoire').get({
  2. success: function(res) {
  3. // res.data 包含该记录的数据
  4. console.log(res.data)
  5. }
  6. })

也可以用 Promise 风格调用:

  1. db.collection('todos').doc('todo-identifiant-aleatoire')
  2. .get()
  3. .then(res => {
  4. // res.data 包含该记录的数据
  5. console.log(res.data)
  6. })
  7. .catch(err=>{
  8. console.log(err)
  9. })

1.2. 查询全部数据

在不指定_id时,如果数据量不足 20 条,通过get()可以查询全部数据。如果数据量超过 20 条,为了防止误操作以及保护小程序体验,小程序端在获取集合数据时服务器一次默认并且最多返回 20 条记录,云函数端这个数字则是 100。开发者可以通过 limit 方法指定需要获取的记录数量,但小程序端不能超过 20 条,云函数端不能超过 100 条。

  1. db.collection('todos').get({
  2. success: function(res) {
  3. // res.data 是一个包含集合中有权限访问的所有记录的数据,不超过 20 条
  4. console.log(res.data)
  5. }
  6. })

也可以用 Promise 风格调用:

  1. db.collection('todos').get().then(res => {
  2. // res.data 是一个包含集合中有权限访问的所有记录的数据,不超过 20 条
  3. console.log(res.data)
  4. })
下面是在云函数端获取一个集合所有记录的例子,因为有最多一次取 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取:
  1. const cloud = require('wx-server-sdk')
  2. cloud.init()
  3. const db = cloud.database()
  4. const MAX_LIMIT = 100
  5. exports.main = async (event, context) => {
  6. // 先取出集合记录总数
  7. const countResult = await db.collection('todos').count()
  8. const total = countResult.total
  9. // 计算需分几次取
  10. const batchTimes = Math.ceil(total / 100)
  11. // 承载所有读操作的 promise 的数组
  12. const tasks = []
  13. for (let i = 0; i < batchTimes; i++) {
  14. const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
  15. tasks.push(promise)
  16. }
  17. // 等待所有
  18. return (await Promise.all(tasks)).reduce((acc, cur) => {
  19. return {
  20. data: acc.data.concat(cur.data),
  21. errMsg: acc.errMsg,
  22. }
  23. })
  24. }

1.3. 条件查询

1.3.1. where 和比较操作符

假设我们需要查询进度大于 30% 的待办事项,那么传入对象表示全等匹配的方式就无法满足了,这时就需要用到查询指令。数据库 API 提供了大于、小于等多种比较符(查询指令),这些指令都暴露在 db.command 对象上。比如查询进度大于 30% 的待办事项:

  1. const _ = db.command
  2. db.collection('todos').where({
  3. // gt 方法用于指定一个 "大于" 条件,此处 _.gt(30) 是一个 "大于 30" 的条件
  4. progress: _.gt(30)
  5. })
  6. .get({
  7. success: function(res) {
  8. console.log(res.data)
  9. }
  10. })

API 提供了以下比较操作符(查询指令):

查询指令说明
eq等于
neq不等于
lt小于
lte小于或等于
gt大于
gte大于或等于
in字段值在给定数组中
nin字段值不在给定数组中

更多具体的查询指令 API 文档可参考数据库 API 文档

1.3.2. 逻辑指令(逻辑运算符)

除了指定一个字段满足一个条件之外,我们还可以通过指定一个字段需同时满足多个条件,比如用 and 逻辑指令查询进度在 30% 和 70% 之间的待办事项:

  1. const _ = db.command
  2. db.collection('todos').where({
  3. // and 方法用于指定一个 "与" 条件,此处表示需同时满足 _.gt(30) 和 _.lt(70) 两个条件
  4. progress: _.gt(30).and(_.lt(70))
  5. })
  6. .get({
  7. success: function(res) {
  8. console.log(res.data)
  9. }
  10. })

既然有 and,当然也有 or 了,比如查询进度为 0 或 100 的待办事项:

  1. const _ = db.command
  2. db.collection('todos').where({
  3. // or 方法用于指定一个 "或" 条件,此处表示需满足 _.eq(0) 或 _.eq(100)
  4. progress: _.eq(0).or(_.eq(100))
  5. })
  6. .get({
  7. success: function(res) {
  8. console.log(res.data)
  9. }
  10. })

如果我们需要跨字段进行 "或" 操作,可以做到吗?答案是肯定的,or 指令还可以用来接受多个(可以多于两个)查询条件,表示需满足多个查询条件中的任意一个,比如我们查询进度小于或等于 50% 或颜色为白色或黄色的待办事项:

  1. const _ = db.command
  2. db.collection('todos').where(_.or([
  3. {
  4. progress: _.lte(50)
  5. },
  6. {
  7. >
    color: _.in(['white', 'yellow'])
  8. }
  9. }
  10. ]))
  11. .get({
  12. success: function(res) {
  13. console.log(res.data)
  14. }
  15. })

更多具体的查询指令 API 文档可参考数据库 API 文档


特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。