Realm ReactNative Flexible Sync 基于嵌入/关系字段查询同步数据
Realm Flexible Sync 按嵌入数组store_id同步商品数据实现方案
查询返回空的核心原因
Flexible Sync 对嵌入式对象数组的过滤有两个强制要求:一是服务端必须把嵌套的store.store_id配置为合法可查询字段,二是客户端必须使用支持的数组匹配语法,任意一点不满足都会直接返回空结果,不会抛出显性错误。
具体实现步骤
- 配置服务端同步规则
进入Atlas App Services的Flexible Sync配置页,找到Product集合的规则设置:- 把
store.store_id添加到集合的可查询字段列表中 - 确认集合的读权限没有做额外限制,允许登录用户读取匹配该条件的文档
- 把
- 客户端使用正确的订阅查询语法
要匹配「store数组中任意一个嵌入对象的store_id等于目标值」的文档,必须使用数组任意元素匹配操作符,不能直接写普通等值查询。不同SDK的写法参考:
其他SDK统一使用// JavaScript/React Native SDK 示例 await realm.subscriptions.update(subs => { subs.add( realm.objects('Product').filtered('store ANY store_id == $0', 1001), { name: 'store_1001_products' } ); }); // 等待同步完成后再查询本地数据 await realm.subscriptions.waitForSynchronization();ANY关键字做数组匹配:比如Swift SDK写"store ANY store_id == %@",Java SDK写"store ANY store_id == $0"即可。 - 常见问题排查
如果配置完还是返回空,逐一核对以下点:- 核对数据库中实际存储的
store_id类型和Schema定义一致:当前Schema里store_id是可空int类型,如果库里存的是字符串、浮点型、64位长整型,会导致类型不匹配查不到数据 - 不要在订阅查询里使用Flexible Sync不支持的语法:比如对嵌入数组用
ALL匹配、多层嵌套逻辑判断、非等值的复杂计算,目前Flexible Sync仅支持嵌入数组的ANY等值匹配 - 注意同步粒度:只要某件商品的store数组里包含store_id=1001的门店信息,**整个Product文档(包含该商品关联的所有其他门店的嵌入数据)**都会被同步到本地,不会单独拆分返回数组里的单个门店对象
- 核对数据库中实际存储的
注意:如果业务场景需要只同步数组中指定store_id的嵌入对象,Flexible Sync目前不支持嵌入式对象的粒度同步,只能同步整个顶层文档。
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

