gpt4 book ai didi

ios - 如何为 Realm 中的关系属性调用聚合函数?

转载 作者:搜寻专家 更新时间:2023-11-01 07:27:27 26 4
gpt4 key购买 nike

有没有办法对一对一和一对多关系中的属性使用聚合函数?这是我正在使用的结构的一个简单示例:

class Toy: Object {
dynamic var purchaseDate: NSDate?
dynamic var name: String = ""
let ratings = List<Rating>()
dynamic var toyOwner: Person?
}

class Rating: Object {
var stars: Int = 0
var comments: String?
}

class Person: Object {
dynamic var name: String = ""
dynamic var age: Int = 0
}

我想做一些类似的事情:

// Average age of owner of all toys purchased within a date range
let avgAge: Double = realm.objects(Toy)
.filter("purchaseDate >= %@ && purchaseDate <= %@", startDate, endDate)
.avg("person.age")

// Sum up all stars given to all toys purchased within a date range
let totalStars: Double = realm.objects(Toy)
.filter("purchaseDate >= %@ && purchaseDate <= %@", startDate, endDate)
.sum("sum(ratings.stars)")

有没有办法在 Realm 中执行这些聚合函数?

最佳答案

尽管 Realm 确实有聚合值函数(请参阅 RealmCollectionType 上的 Aggregate Operations 文档),但这些函数目前不适用于 person.age 等多级键路径。

但是,您可以通过稍微修改您的查询来使用 Realm 完成大部分繁重的工作:

// Average age of owner of all toys purchased within a date range
let ages = realm.objects(Toy)
.filter("purchaseDate BETWEEN %@", [startDate, endDate])
.valueForKeyPath("toyOwner.age") as! [Double]
let avgAge = ages.reduce(0, combine: +) / Double(max(ages.count, 1))

// Sum up all stars given to all toys purchased within a date range
let totalStars = realm.objects(Toy)
.filter("purchaseDate BETWEEN %@", [startDate, endDate])
.reduce(0) { sum, toy in
return sum + toy.ratings.sum("stars")
}

关于ios - 如何为 Realm 中的关系属性调用聚合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com