You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Кирилл Магеря

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:39:06