很多人刚用 uniCloud 的操作数据库的时候都会遇到一个问题:
javascript
const db = uniCloud.database()
和
javascript
const db = uniCloud.databaseForJQL()
到底有什么区别?
应该用哪个?
我一开始也有点懵。后来踩过坑之后,总结得比较清楚了。
今天一次性讲明白。
一句话区别
-
database()是传统 Mongo 风格接口 -
databaseForJQL()是 JQL 查询引擎接口
简单理解:
一个偏底层,一个偏前端查询
1️⃣ uniCloud.database()
这是最基础的数据库接口。
写法偏 Mongo 风格:
javascript
const db = uniCloud.database()
db.collection('users')
.where({ status: 1 })
.get()
特点:
-
类 Mongo 操作
-
支持 command 原子操作(inc、push、pull 等)
-
支持事务
-
更底层
-
灵活度高
比如要做积分或者敏感数据的增加:
javascript
db.collection('users').doc(uid).update({
score: db.command.inc(10)
})
这种必须用它。
2️⃣ uniCloud.databaseForJQL()
这是 DCloud 推出的 JQL 引擎接口。
javascript
const db = uniCloud.databaseForJQL()
db.collection('users')
.where('status == 1')
.get()
你会发现:
-
查询语法更接近 SQL
-
更简洁
-
官方未来主推方向
它的核心是:
统一查询能力 + 自动权限校验 + 更好的引擎优化
那到底该用哪个?
这才是重点。
✅ 页面数据查询 → 推荐用 databaseForJQL()
比如:
-
列表页数据
-
分类筛选
-
状态筛选
-
分页查询
这种偏"读操作"的场景,用 JQL 更舒服。
优点:
-
写法更清晰
-
更利于索引优化
-
更符合官方未来方向
✅ 云函数 / 云对象 / 事务操作 → 用 database()
比如:
-
原子递增
-
扣减库存
-
积分系统
-
事务处理
-
批量更新
这种偏"写操作"的复杂逻辑,用 database() 更稳。
因为:
-
支持 command
-
支持事务
-
更接近 Mongo 底层能力
性能有区别吗?
小数据量下:
几乎没有差别。
数据量大、结构复杂时:
JQL 在查询优化上更有优势。
但说实话,如果你只是几十条数据,根本感觉不到。
为什么很多示例都用 database()?
原因很简单:
-
它历史更早
-
兼容性更强
-
官方很多旧示例用它
-
更像传统 Mongo 写法
但从趋势看:
页面查询用 JQL 是更推荐的方式。
我的使用建议(实战总结)
直接给一个清晰的分工建议:
🔹 页面列表、筛选、分页
用:
javascript
uniCloud.databaseForJQL()
🔹 云函数、事务、原子更新
用:
javascript
uniCloud.database()
这样分工清晰,代码结构也更干净。
最后总结
如果你只记住一句话:
读操作偏向 JQL,写操作偏向传统 database。
别纠结"哪个更高级",
选对场景才是关键。