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 失踪了,因为他有一只猎犬。
是否可以在带有 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 失踪了,因为他有一只猎犬。