uniapp_db schema的常见错误纠偏


这篇文章是评价 这篇文章

点评

这段话中存在多处事实错误和表述不准确的地方,

核心问题集中在对uniCloud核心概念的关联关系生效范围使用场景理解偏差上。

核心概念:DB Schema、JQL、clientDB、MongoDB API

一、核心事实错误(按原文顺序)

错误1:“必须通过JQL操作数据库才能发挥DB Schema的价值”

错误原因

缩小DB Schema生效范围

JQL非唯一能触发DB Schema的方式。

正确知识点

uniCloud中,

DB Schema的价值(权限控制字段校验联表规则默认值等)

可通过两种核心方式触发:


1、客户端直接操作(clientDB)

客户端调用uniCloud.clientDB相关API(如getListadd)时,

自动遵循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设计基础

正确知识点

uniCloudDB 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官方APIuniCloud.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特有配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值