使用列表中元素的 属性 对领域结果进行排序

Sort realm results using a property of an element in a list

我有两个领域 classes... 第一个 class Patient 包含一个或多个第二个 class Record,作为以下:

class Patient: Object, ObjectKeyIdentifiable {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted var records: List<Record>

}

class Record: EmbeddedObject {
    @Persisted var date = Date()

    @Persisted(originProperty: "records") var patient: LinkingObjects<Patient>

}

我想按最后 recorddatepatients 进行排序,如下所示:

patients = realm.objects(Patient.self).sorted(byKeyPath: "records.last.date", ascending: false)

realm 和 swift 这可能吗?

谢谢

objective 是根据患者记录列表中记录的最新日期对患者进行排序。

这是可以做到的,有几种方法。一种选择是,在填充患者记录时,单独 属性 记录最新日期。

患者对象看起来像这样

class Patient: Object, ObjectKeyIdentifiable {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted private var records: List<Record>
    @Persisted var lastRecord: Record!

    func addRecord(withRecod: Record) {
        self.records.append(withRecord)
        let recordArray = Array(self.records)

        if withRecod != nil {
            let sortedRecords = recordArray.sorted { [=10=].date < .date }
            let lastRecord = sortedRecords.last!
            let rec = Record(value: lastRecord)
            self.lastRecord = rec
        }
    }
}

我们添加了一个函数来填充记录列表并将该列表设为私有,因此您不得不使用 addRecord 函数来填充 属性。

需要数组,因为 Realm 不会在内存中排序 - 因此,如果对象尚未持久化,则无法对记录进行排序,因此可以利用数组来完成该任务。

最后,数组按日期排序,然后我们复制最后一条记录以存储在 lastRecord 属性 中。嵌入式对象永远不会被持久化 'on their own' 它们不能像其他对象一样被引用,所以一个副本就可以了。

那么排序就变得简单了

let patients = realm.objects(Patient.self).sorted(byKeyPath: "lastRecord.date")

记住 updateRecorddeleteRecord 函数可能是为了 re-calculate lastRecord 发生这些变化。