这篇文章是评价 这篇文章
点评
这段话中存在多处事实错误和表述不准确的地方,
核心问题集中在对uniCloud核心概念的关联关系、生效范围及使用场景理解偏差上。
核心概念:DB Schema、JQL、clientDB、MongoDB API
一、核心事实错误(按原文顺序)
错误1:“必须通过JQL操作数据库才能发挥DB Schema的价值”
错误原因
缩小了DB Schema的生效范围,
JQL并非唯一能触发DB Schema的方式。
正确知识点
uniCloud中,
DB Schema的价值(权限控制、字段校验、联表规则、默认值等)
可通过两种核心方式触发:
1、客户端直接操作(clientDB)
客户端调用uniCloud.clientDB相关API(如getList、add)时,
会自动遵循DB Schema的配置(无需写JQL);
2、JQL查询
无论是客户端还是云函数中,JQL会完全生效DB Schema的所有规则;
仅当使用传统MongoDB API(如db.collection('xxx').find())时,DB Schema的权限/校验规则才不生效。
总结
1、使用clientDB操作数据库,db schema所有规则能生效
2、使用jql操作数据库,db schema所有规则能生效
3、使用mongodb api操作数据库,db schema所有规则不生效
错误2:“db schema跟json schema没有关系”
错误原因
完全否定了两者的底层关联,
违背uniCloud DB Schema的设计基础。
正确知识点
uniCloud的DB Schema是基于JSON Schema规范扩展而来的
基础语法(如字段类型type: 'string'、值域校验enum: [1,2]、必填项required: true、对象嵌套properties)完全遵循JSON Schema标准;
uniCloud仅在JSON Schema基础上,额外增加了云数据库特有的配置(如权限控制permission、联表规则join、树结构tree)。
因此两者是“基础规范+扩展功能”的关系,并非“无关”。

错误3:“不管在客户端还是云端,都必须使用JQL操作数据库”
错误原因
完全限定了数据库操作方式,与uniCloud的实际功能冲突。
正确知识点
uniCloud支持多种数据库操作方式,并非必须用JQL:
| 操作端 | 支持的操作方式(非JQL也可) | 备注 |
|---|---|---|
| 客户端(App) | clientDB API(如uniCloud.clientDB.getList()) | 无需写JQL,直接调用封装好的CRUD接口 |
| 云端(云函数) | 传统MongoDB API(如db.collection('xxx').insertOne()) | 仅DBSchema权限/校验不生效,功能可正常使用 |
| 云端(云函数) | uniCloud封装API(如db.collection('xxx').get()) | 基础CRUD无需JQL,复杂查询才需JQL |
错误4:“客户端操作数据库时必须完全编写DB Schema,尤其权限部分”
错误原因
“必须完全编写”的表述过于绝对,不符合实际使用场景。
正确知识点
1、非“必须”
客户端操作数据库(clientDB)时,
DB Schema是推荐编写而非“强制要求”
——若应用仅需简单CRUD(无权限控制、字段校验需求),
不写DB Schema也能运行(但安全性差,不推荐);
2、非“完全”
DB Schema支持按需编写
——例如仅需权限控制,
可只配置permission节点;
仅需字段校验,
可只配置properties节点,
无需完全编写所有配置项。
错误5:“在云函数中编写权限控制代码,需把DB Schema的权限都设为false,通过setuser API设为admin”
错误原因
存在两处细节错误(API名称 + 权限配置逻辑)。
正确知识点
1、API名称错误:
setuser应为setUser(驼峰命名,uniCloud官方API为uniCloud.database().setUser());
2、权限配置错误:
无需“把DB Schema的权限都设为false”
——正确做法是:
将DB Schema中对应集合的permission
设为自定义权限(或仅关闭当前角色的权限),
再通过setUser({role: 'admin'})让云函数跳过权限校验
(若设为false,会直接禁止所有操作,反而需要额外解锁)。
二、补充:联表查询/Tree查询的实例(原文未举例,补充以辅助理解)
1、联表查询实例(基于DB Schema配置)
假设存在两个集合:
user(用户表)
-
_id(用户ID) -
name(用户名) -
age(年龄)
order(订单表)
-
_id(订单ID) -
user_id(关联用户ID) -
goods(商品名) -
price(价格)
DB Schema配置(order集合)
{
"bsonType": "object",
"properties": {
"user_id": {
"bsonType": "string",
"join": { // 联表规则(uniCloud扩展的JSON Schema配置)
"collection": "user", // 关联的集合名
"localField": "user_id", // 当前集合的关联字段
"foreignField": "_id", // 关联集合的匹配字段
"project": { "name": 1, "age": 1 } // 关联后返回的字段
}
},
"goods": { "bsonType": "string" },
"price": { "bsonType": "number" }
}
}
查询效果
用JQL查询订单时,可直接获取关联的用户信息。
// JQL查询(客户端/云函数均可)
const jql = uniCloud.database().collection('order').where({}).getJoin();
// 返回结果中,每个订单会包含user_id对应的用户name和age
2、Tree查询实例(基于DB Schema配置)
假设存在category(分类表),
需实现多级分类(如电子产品→手机→智能手机)
-
_id(分类ID) -
name(分类名) -
parent_id(父分类ID,顶级分类为0)
DB Schema配置(category集合)
{
"bsonType": "object",
"properties": {
"name": { "bsonType": "string" },
"parent_id": { "bsonType": "string", "default": "0" }
},
"tree": { // 树结构配置(uniCloud扩展)
"parentKey": "parent_id", // 父节点关联字段
"levelKey": "level", // 自动生成的“层级”字段(如顶级为1,子级为2)
"childrenKey": "children" // 自动生成的“子节点”数组字段
}
}
查询效果
调用Tree查询API,一次性获取完整分类树。
// 客户端clientDB查询
const res = await uniCloud.clientDB.collection('category').getTree({
rootFilter: { parent_id: "0" } // 从顶级分类开始查询
});
// 返回结果为树形结构:[{_id: "1", name: "电子产品", level: 1, children: [{_id: "2", name: "手机", ...}]}]
三 、总结:正确的核心结论(修正原文偏差后)
1、DB Schema是基础
无论客户端还是云函数操作数据库,
建议编写DB Schema(非强制),
以确保权限安全、字段规范;
2、操作方式灵活
客户端优先用clientDB(无需JQL),
云端复杂查询用JQL、简单逻辑可用MongoDB API;
3、权限控制适配
云函数自己处理权限时,
用setUser({role: 'admin'})跳过DB Schema权限,
无需将权限设为false;
4、DB Schema与JSON Schema关联
前者基于后者扩展,基础语法一致,仅增加uniCloud特有配置。

被折叠的 条评论
为什么被折叠?



