MongoDB Realm一对多关系下删除关联数组指定对象的实现方法
Realm 一对多关系下删除关联数组指定元素的正确实现
原代码问题分析
原有写法的逻辑错误如下:
- 执行的查询返回结果是
Shop类型的对象集合,直接调用realm.delete(obj)会删除整个店铺对象,而非店铺下products数组中的指定产品元素。 - 过滤条件中添加
products._id == $1只是筛选出「关联了对应id产品的店铺」,返回的对象类型仍然是店铺,不是目标产品实例。
正确实现步骤
首先查询到目标店铺,再从店铺的关联产品列表中找到要删除的产品,根据业务需求选择对应操作:
// 1. 查询目标店铺 const targetShop = realm.objects('Shop').filtered("_id == $0", ObjectId('60f73ca7c1a70278596cc7d0'))[0]; if (!targetShop) return; // 2. 查询要删除的目标产品 const targetProduct = targetShop.products.filtered("_id == $0", ObjectId('2'))[0]; if (!targetProduct) return; realm.write(() => { // 场景1:仅解除当前店铺和该产品的关联,产品本身保留在Realm中(适合多店铺共享产品的场景) const productIndex = targetShop.products.indexOf(targetProduct); targetShop.products.splice(productIndex, 1); // 场景2:彻底删除该产品在Realm中的所有数据,所有关联该产品的店铺的products数组会自动移除对应元素 // realm.delete(targetProduct); })
注意事项
- Realm 会自动维护对象关联关系,如果删除了被关联的产品实例,所有店铺的关联数组中对应的元素会自动清空,无需手动处理。
- 操作前增加空值判断可以避免查询不到对应数据时引发的运行异常。
内容的提问来源于stack exchange,提问作者Amani
相关产品推荐
相关产品推荐

