React Native+TypeScript中MongoDB Realm嵌入对象添加至列表报错求助
解决MongoDB Realm嵌入对象创建错误
错误原因
你遇到的Error: Exception in HostFunction: Embedded objects cannot be created directly,是因为Realm中标记为embedded: true的嵌入对象不允许通过new关键字直接实例化,必须通过父文档的关联属性或Realm专用方法创建。
修复方案
有两种可行的解决方式:
方案1:直接向列表推送对象字面量
无需手动实例化yyyy对象,直接向c列表传入包含属性的对象字面量,Realm会自动将其转换为对应的嵌入对象:
const createYYYY = useCallback( ({y, z}: {y: string, z: string}) => { return realm.write(() => { // 直接传入对象字面量,Realm自动处理嵌入对象创建 instanceForUpdate.c?.push({y, z}); }); }, // 补充完整依赖项,比如realm、instanceForUpdate [realm, instanceForUpdate] );
注:yyyy的_id字段在schema中配置了默认生成逻辑,无需手动传入,Realm会自动赋值。
方案2:使用createEmbeddedObject方法
通过Realm实例的createEmbeddedObject方法创建嵌入对象,该方法会自动将对象关联到父文档的指定属性中:
const createYYYY = useCallback( ({y, z}: {y: string, z: string}) => { return realm.write(() => { // 创建嵌入对象并自动添加到instanceForUpdate的c列表中 realm.createEmbeddedObject(instanceForUpdate, 'c', {y, z}); }); }, [realm, instanceForUpdate] );
额外注意事项
- 确保
instanceForUpdate是从Realm查询返回的活跃对象,而非已被detach的对象; - 所有修改操作必须在
realm.write()事务内部执行,你当前的代码已满足此要求; - 若
c列表初始为undefined,Realm在首次push时会自动初始化空列表,无需额外处理。
内容的提问来源于stack exchange,提问作者Supi
相关产品推荐
相关产品推荐

