React Native中Realm Flexible Sync动态键Schema定义问题
解决Realm Flexible Sync中动态ObjectId键的Schema定义问题
针对你遇到的group_taxes字段包含动态ObjectId键的场景,不能直接用mixed或无类型约束的字典,需要明确动态键对应的值的结构,以下是具体解决方法:
核心思路
group_taxes是一个以ObjectId字符串为键、固定结构税务对象为值的字典,Realm Flexible Sync需要明确值的Schema才能正确同步和处理数据,因此要先定义税务子对象的Schema,再将group_taxes定义为对应类型的字典。
1. React Native中Realm Schema定义(JS/TS)
先定义税务子对象的Schema,再在主Schema中声明group_taxes为该类型的字典:
import Realm from 'realm'; // 定义税务子对象的Schema const TaxSchema = { name: 'Tax', properties: { tax_id: 'objectId', tax_name: 'string', tax_rate: 'int', calculated_tax: 'int', tax_calculation: 'string', // 也可指定枚举值:{ type: 'string', enum: ['PERCENTAGE', 'FLAT_VALUE'] } }, }; // 主文档Schema const MainDocumentSchema = { name: 'MainDocument', properties: { // 用`Tax{}`表示键为字符串、值为Tax类型的字典 group_taxes: 'Tax{}', // 可添加其他属性,比如主键 _id: 'objectId', }, primaryKey: '_id', }; // 初始化Realm实例 const realm = await Realm.open({ schema: [MainDocumentSchema, TaxSchema], sync: { user: Realm.App.getApp('你的APP_ID').currentUser, partitionValue: '你的分区键值', }, });
2. MongoDB Atlas对应的Flexible Sync JSON Schema
如果需要在Atlas控制台配置Schema,使用additionalProperties约束动态键对应的值结构:
{ "properties": { "group_taxes": { "bsonType": "object", "additionalProperties": { "bsonType": "object", "properties": { "tax_id": { "bsonType": "objectId" }, "tax_name": { "bsonType": "string" }, "tax_rate": { "bsonType": "int" }, "calculated_tax": { "bsonType": "int" }, "tax_calculation": { "bsonType": "string", "enum": ["PERCENTAGE", "FLAT_VALUE"] } }, "required": ["tax_id", "tax_name", "tax_rate", "calculated_tax", "tax_calculation"] } } } }
为什么之前的写法无效?
mixed类型过于宽泛,Flexible Sync无法识别其中的结构化数据,导致同步和查询异常;- 未指定值类型的字典,Realm无法确定动态键对应值的结构,无法完成数据校验和同步逻辑。
内容的提问来源于stack exchange,提问作者Hardik Chavda
相关产品推荐
相关产品推荐

