第4章:云数据库操作(上)——初始化数据库、查询数据

好,咱们今天来聊聊云数据库的操作。说实话,这是整个云开发里最核心的部分——没有数据,小程序就是个空壳子。我刚开始接触云开发时,第一件事就是研究数据库怎么玩。今天先讲查询,这是最基础也最常用的操作。

4.1 初始化数据库

在操作数据库之前,得先拿到数据库的「钥匙」。说白了,就是初始化一个数据库实例。

代码很简单,就两行:

// 获取数据库引用
const db = wx.cloud.database()

嗯,就这么一行。但这里有个坑——必须先调用云开发初始化。我记得刚入坑时,直接写 wx.cloud.database() 就报错,后来才发现少了初始化。

正确的完整写法是:

// 1. 初始化云开发环境
wx.cloud.init({
  env: '你的环境ID'  // 建议用字符串形式指定
})

// 2. 获取数据库引用
const db = wx.cloud.database()
注意:初始化只需要执行一次。我习惯在 app.js 的 onLaunch 里做初始化,这样整个小程序都能用。

拿到 db 对象后,就可以操作集合了。集合名就是你在云开发控制台里创建的那个名字。

// 获取集合引用
const todosCollection = db.collection('todos')

4.2 查询单条数据(get)

查询单条数据,最常用的就是通过文档ID来查。每个文档在创建时,系统会自动分配一个唯一的 _id

代码长这样:

// 假设你知道文档ID
const docId = 'xxxxxx'  // 替换成真实的ID

db.collection('todos').doc(docId).get().then(res => {
  console.log(res.data)  // 返回的就是这条文档数据
}).catch(err => {
  console.error('查询失败', err)
})

这里有个细节——res.data 就是文档内容,包含 _id_openid(如果是权限控制的数据)。

小技巧:我在调试时,经常用 console.log(JSON.stringify(res, null, 2)) 来格式化输出,看得更清楚。

如果文档不存在,res.data 会是 null。所以拿到数据后,最好先判断一下:

if (res.data) {
  // 有数据,正常处理
} else {
  // 没找到,给用户提示
}

4.3 查询多条数据(get)

多条查询,说白了就是查一个集合里的所有文档,或者按条件筛选。最基础的是查全部:

db.collection('todos').get().then(res => {
  console.log(res.data)  // 数组形式返回
})

但这里有个限制——默认最多返回20条。为什么?我猜是怕你一次性拉太多数据,把小程序搞卡了。我曾经在项目里没注意这个限制,结果列表只显示了20条,用户以为数据丢了……

要突破这个限制,得用 limit 方法:

// 最多查100条
db.collection('todos').limit(100).get()

但注意,单次查询上限是100条。如果你数据量很大,得用分页(后面章节会讲)。

4.4 带条件的多条查询

实际开发中,很少直接查全部。更多是按条件筛选。比如查「已完成」的任务:

db.collection('todos').where({
  completed: true
}).get()

where 里写的就是筛选条件。支持多种操作符,比如:

操作符 说明 示例
$eq 等于 { age: _.eq(18) }
$neq 不等于 { age: _.neq(18) }
$gt 大于 { age: _.gt(18) }
$gte 大于等于 { age: _.gte(18) }
$lt 小于 { age: _.lt(18) }
$lte 小于等于 { age: _.lte(18) }

使用这些操作符前,需要先引入 db.command

const _ = db.command

// 查年龄大于18的用户
db.collection('users').where({
  age: _.gt(18)
}).get()
重点:操作符的引入方式 const _ = db.command,这个下划线是约定俗成的写法,你也可以用其他变量名。

4.5 排序与限制

查询结果往往需要排序。比如按创建时间倒序:

db.collection('todos').orderBy('createdAt', 'desc').get()

orderBy 第一个参数是字段名,第二个是排序方向:asc(升序)或 desc(降序)。

排序和限制可以组合使用:

// 查最新的10条任务
db.collection('todos')
  .orderBy('createdAt', 'desc')
  .limit(10)
  .get()

你想想看,这种组合在实际项目中太常见了——比如首页只显示最近几条动态。

4.6 避坑指南

最后分享几个我踩过的坑:

  • 字段名大小写敏感createdAtcreatedat 是两个不同的字段。我曾在代码里写错了大小写,查了半天没数据。
  • 查询条件别写反where 里是「字段: 值」,不是「值: 字段」。这个错误我见过新手犯过好几次。
  • 权限问题:默认情况下,用户只能查到自己创建的数据。如果你查不到数据,先检查一下集合的权限设置。
  • 异步别忘了get() 返回的是 Promise,记得用 .thenasync/await 处理结果。
我的习惯:每次写查询前,先在云开发控制台里手动查一下,确认数据存在、字段名正确。这样能省很多调试时间。

好了,今天的内容就到这。下一章咱们聊「增删改」——怎么往数据库里写数据、更新数据、删除数据。这些操作比查询稍微复杂一点,但掌握了套路就很简单。