Realm中如何设置NSPredicate查询totalPrice大于指定值的OrderObject
Realm 按关联EmbeddedObject总价查询解决方案
现有模型定义
final class OrderObject: Object { @Persisted var items: List<OrderItemObject> } final class OrderItemObject: EmbeddedObject { @Persisted var price: Decimal128 @Persisted var count: Int }
查询实现方案
你可以通过SUBQUERY结合@sum聚合运算符完成这个需求,示例代码如下:
// 指定阈值,注意要和price类型保持一致,使用Decimal128 let threshold = Decimal128(value: 50) // 构造查询谓词 let predicate = NSPredicate(format: "SUBQUERY(items, $item, TRUEPREDICATE).@sum($item.price * $item.count) > %@", threshold as CVarArg) // 执行查询 let result = realm.objects(OrderObject.self).filter(predicate)
注意事项
- 上述写法适用于Realm 10.0及以上版本,低版本Realm不支持在聚合运算符里嵌套表达式,需要改用冗余字段方案
- 实时聚合查询的性能会随关联item数量上升而下降,如果数据量较大,建议在
OrderObject中新增@Persisted var totalPrice: Decimal128字段,在新增/修改/删除item时自动更新该字段的值,后续直接查询totalPrice > 50即可,性能提升非常明显 - 传入谓词的阈值必须和
price的Decimal128类型匹配,不能直接传Int或者Double,否则会出现类型不匹配导致查询结果错误
内容的提问来源于stack exchange,提问作者Кирилл Магеря
相关产品推荐
相关产品推荐

