第4章:云数据库操作(上)——初始化数据库、查询数据
好,咱们今天来聊聊云数据库的操作。说实话,这是整个云开发里最核心的部分——没有数据,小程序就是个空壳子。我刚开始接触云开发时,第一件事就是研究数据库怎么玩。今天先讲查询,这是最基础也最常用的操作。
4.1 初始化数据库
在操作数据库之前,得先拿到数据库的「钥匙」。说白了,就是初始化一个数据库实例。
代码很简单,就两行:
// 获取数据库引用
const db = wx.cloud.database()
嗯,就这么一行。但这里有个坑——必须先调用云开发初始化。我记得刚入坑时,直接写 wx.cloud.database() 就报错,后来才发现少了初始化。
正确的完整写法是:
// 1. 初始化云开发环境
wx.cloud.init({
env: '你的环境ID' // 建议用字符串形式指定
})
// 2. 获取数据库引用
const db = wx.cloud.database()
拿到 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 避坑指南
最后分享几个我踩过的坑:
- 字段名大小写敏感:
createdAt和createdat是两个不同的字段。我曾在代码里写错了大小写,查了半天没数据。 - 查询条件别写反:
where里是「字段: 值」,不是「值: 字段」。这个错误我见过新手犯过好几次。 - 权限问题:默认情况下,用户只能查到自己创建的数据。如果你查不到数据,先检查一下集合的权限设置。
- 异步别忘了:
get()返回的是 Promise,记得用.then或async/await处理结果。
好了,今天的内容就到这。下一章咱们聊「增删改」——怎么往数据库里写数据、更新数据、删除数据。这些操作比查询稍微复杂一点,但掌握了套路就很简单。