Swift NSPredicate SUBQUERY 与 NOT IN?

Swift NSPredicate SUBQUERY with NOT IN?

是否可以在带有 SUBQUERY 的 NSPredicate 中使用 "NOT IN"?

在 'normal' NSPredicate 中,这有效:

NSPredicate(format: "NOT (uid IN %@)", uids)

但是,我在带有 SUBQUERY 的 NSPredicate 中尝试这个 "NOT IN" 语法,但它不起作用(但也没有崩溃):

NSPredicate(format:"SUBQUERY(forests.treeFamily, $tree, NOT ($tree._id IN %@)) .@count > 0", arrayOfTreesIds)

虽然以下 "IN" 语法工作正常:

NSPredicate(format:"SUBQUERY(forests.treeFamily, $tree, $tree._id IN %@) .@count > 0", arrayOfTreesIds)

知道如何实现吗?


已更新

我从 Jay 那里得到的答案让我觉得我在 schema/class 上不够清楚。

所以让我们以狗为例。

我们有一个 ShelterClass,它有 属性 只狗。它是一组 Dog 对象,用于跟踪收容所中收容了哪些狗。

狗 class 有一个 "race" 属性,这是对种族 class.

的引用

我想过滤掉没有特定犬种的收容所。 虽然我会用它来过滤确实有某些狗的庇护所:

NSPredicate(format:"SUBQUERY(dogs.race, $race, $race._id IN %@) .@count > 0", arrayOfRaceIds)

我找不到如何过滤/使用 "NOT IN" 语法。

超级简单!这是常规过滤器的格式

如果你有 DogClass

class DogClass: Object {
   @objc dynamic var name = ""
}

然后想要一个不叫 Dino 和 Fido 的狗的列表,这是代码

 let dogNames = ["Fido", "Dino"]
 let results = realm.objects(DogClass.self).filter("NOT dog_name IN %@", dogNames)

子查询的结果将取决于您期望的结果以及子查询的用途。

例如,假设我们有一个包含 属性 条狗的 PersonClass,这是他们认识的狗的列表。如果我们想要所有不认识 Fido 或 Dino 的人,这就是查询

let personResults = realm.objects(PersonClass.self).filter("NOT ANY dogs.dog_name in %@", dogNames)

编辑

根据更新的问题,让我们试试这个。由于我在上面使用了PersonClass,所以我会提出这个问题。

I want a list of all of the people (Shelters) that do not have a breed (race) of Hound. Here's the Breed class to track the breeds

class BreedClass: Object {
    @objc dynamic var breed = ""
}

和具有品种 属性 的 DogClass(如问题中的 'Race')

class DogClass: Object {
    @objc dynamic var dog_id = NSUUID().uuidString
    @objc dynamic var dog_name = ""
    @objc dynamic var dog_breed: BreedClass?

    override static func primaryKey() -> String? {
        return "dog_id"
    }
}

最后是具有 DogClass 对象列表的 Person class

class PersonClass: Object {
    @objc dynamic var person_id = UUID().uuidString
    @objc dynamic var first_name = ""

    let dogs = List<DogClass>()

    override static func primaryKey() -> String? {
        return "person_id"
    }
}

然后我们有一些填充的品种对象

let b0 = BreedClass()
b0.breed = "Mut"

let b1 = BreedClass()
b1.breed = "Poodle"

let b2 = BreedClass()
b2.breed = "Hound"

然后将品种添加到狗,将狗添加到人。在这种情况下,我们只会有一只 b2 狗,Hound

let d2 = DogClass()
d2.dog_name = "Sasha"
d2.dog_breed = b2

在这种情况下,我添加了 4 个人,Bert、Ernie、Grover 和 The Count。厄尼是我唯一添加猎犬的人。

最后一个查询 return 所有没有猎犬品种的人。

let breed = "Hound"
let personResults = realm.objects(PersonClass.self).filter("NOT ANY dogs.dog_breed.breed == %@", breed)
for person in personResults {
    print(person.first_name)
}

和输出

Bert
Grover
The Count

Ernie 失踪了,因为他有一只猎犬。