swift 领域筛选器嵌套数组

ruyhziif  于 2023-01-29  发布在  Swift
关注(0)|答案(1)|浏览(124)

我有三个目标

class YearDatabaseModel: Object {
    @Persisted var year: Int
    @Persisted var months = List<MonthsDatabaseModel>()

    override static func primaryKey() -> String? {
        return "year"
    }
}
final class MonthsDatabaseModel: Object {
    @Persisted var id: String
    @Persisted var media = List<Model>()

    override static func primaryKey() -> String? {
        return "id"
    }
}
public class Model: Object {
    @Persisted public var id: String
    @Persisted public var type: String
}

我需要返回所有的年模型与过滤器嵌套的月。模型项目与他们的类型,例如只是返回模型项目的月份与类型=="音频"
我确实使用了这个SUBQUERY,但它只是过滤年份列表,而不是过滤型号列表

let predicate = NSPredicate(
                format: "SUBQUERY(months.media, $media, $media.type = %@).@count > 0",
 "audio")

我不想获得领域结果,然后通过平面Map模型列表来过滤模型,我想使用领域查询功能从大模型中过滤嵌套对象

fnvucqvd

fnvucqvd1#

由于深度和处理Lists,这是一个非常具有挑战性的查询,但子查询可能是最佳解决方案,除非您想利用高级Swift函数。
我 * 认为 * 这将得到你的结果,但它是一个两部分的查询,目前的SwiftSDK没有一个(好的)实现子查询本身,所以我使用一个老学校NSPredicate结合较新的类型安全查询来获得结果

let predicate = NSPredicate(format: "SUBQUERY(media, $m, $m.type == 'm0 type 0').@count > 0")
let months = realm.objects(MonthsDatabaseModel.self).filter(predicate)

let years = realm.objects(YearDatabaseModel.self).where { $0.months.containsAny(in: months) }
print(years)

我们使用子查询来获取具有Modeltype = "audio"的所有月份MonthsDatabaseModel
然后,我们使用这些结果来获取在其列表中具有匹配月份的YearDatabaseModel

相关问题