Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

データのフィルター - Swift SDK

項目一覧

  • Overview
  • このページの例について
  • Realm Swift クエリ API
  • 演算子
  • 比較演算子
  • コレクション
  • 論理演算子
  • string演算子
  • 地理空間演算子
  • 集計演算子
  • 集合演算子
  • サブクエリ
  • NPredate クエリ
  • ドット表記
  • 置換
  • 演算子
  • 比較演算子
  • 論理演算子
  • string演算子
  • 地理空間演算子
  • 集計演算子
  • 集合演算子
  • サブクエリ

Realm 内のデータをフィルタリングするには、Realm のクエリ エンジンを活用できます。

バージョン 10.19.0 の新機能: : Realm Swift クエリ API

Realm Swift クエリ APIは、Swift 開発者がデータをクエリする慣用的な方法を提供します。 Swift スタイルの構文を使用して、オートコンプリートと型の安全性の利点を持つ Realm をクエリします。 Realm Swift クエリ API は、新しい SDK バージョンの NPredify Query API を置き換えるものではありません。代わりに、いずれかを使用できます。

10.19.0より前の SDK バージョン、または Objective-C 開発者の場合、Realm のクエリ エンジンはN述語クエリをサポートします。

このページの例では、タスク リスト アプリの単純なデータセットを使用しています。 Realm の 2 つのオブジェクトタイプは、 ProjectTaskです。 Taskには、名前、割り当て者の名前、完了したフラグがあります。 優先順位には任意の数値があり、優先順位が高いほど重要であり、その作業に費やされた時間数も存在します。 最後に、Task には 1 つ以上のstring labels と 1 つ以上の整数 ratings を含めることができます。

Projectには 0 個以上のTasksがあります。

これらの 2 つのクラス、 ProjectTaskのスキーマを以下で参照してください。

// Task.h
@interface Task : RLMObject
@property NSString *name;
@property bool isComplete;
@property NSString *assignee;
@property int priority;
@property int progressMinutes;
@end
RLM_COLLECTION_TYPE(Task)
// Task.m
@implementation Task
@end
// Project.h
@interface Project : RLMObject
@property NSString *name;
@property RLMArray<Task> *tasks;
@end
// Project.m
@implementation Project
@end
class Task: Object {
@Persisted var name = ""
@Persisted var isComplete = false
@Persisted var assignee: String?
@Persisted var priority = 0
@Persisted var progressMinutes = 0
@Persisted var labels: MutableSet<String>
@Persisted var ratings: MutableSet<Int>
}
class Project: Object {
@Persisted var name = ""
@Persisted var tasks: List<Task>
}

次のコードを使用して、これらの例の Realm を設定できます。

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^() {
// Add projects and tasks here
}];
RLMResults *tasks = [Task allObjectsInRealm:realm];
RLMResults *projects = [Project allObjectsInRealm:realm];
let realm = try! Realm()
try! realm.write {
// Add tasks and projects here.
let project = Project()
project.name = "New Project"
let task = Task()
task.assignee = "Alex"
task.priority = 5
project.tasks.append(task)
realm.add(project)
// ...
}
let tasks = realm.objects(Task.self)
let projects = realm.objects(Project.self)

バージョン 10.19.0 の新機能: 10.19.0 より古い SDK バージョンの場合は、 NPredify クエリ API を使用します。

.where Realm Swift クエリ APIを使用して、Swift スタイルの構文でフィルターを作成できます。

let realmSwiftQuery = projects.where {
($0.tasks.progressMinutes > 1) && ($0.tasks.assignee == "Ali")
}

このクエリ API は、クエリを実行するためのNPredateを構築します。 これにより、開発者に直接使用できる型セーフな慣用 API が提供され、 NPredate 構築が抽象化されます。

.where API は、true または false で評価するコールバックを受け取ります。 コールバックはクエリ対象の型のインスタンスを受け取ります。コンパイラーを活用して、有効なプロパティを参照する有効なクエリを作成しているかどうかを静的に確認できます。

このページの例では、コールバックに渡される変数を参照するために$0の省略形を使用しています。

Realm コレクションをクエリするにはいくつかのタイプの演算子があります。 クエリは、クエリ対象のコレクション内のすべてのオブジェクトの演算子式を評価することで機能します。 式がtrueに解決される場合、Realm Database は結果コレクションにオブジェクトを含めます。

Realm Swift Query API で Swift 比較演算子を使用できます( ==!=>>=<<= )。

次の例では、クエリ エンジンの比較演算子を使用して次のようにします。

  • priorityプロパティ値の値をしきい値と比較して、優先順位の高いタスクを見つけます。どの優先順位を超えると、優先順位が高いと見なされます。

  • progressMinutesプロパティが一定の値以上であるかどうかを確認して、実行時間が長いタスクを見つけます。

  • assigneeプロパティがnullに等しいタスクを見つけて、割り当てられていないタスクを見つけます。

let highPriorityTasks = tasks.where {
$0.priority > 5
}
print("High-priority tasks: \(highPriorityTasks.count)")
let longRunningTasks = tasks.where {
$0.progressMinutes >= 120
}
print("Long running tasks: \(longRunningTasks.count)")
let unassignedTasks = tasks.where {
$0.assignee == nil
}
print("Unassigned tasks: \(unassignedTasks.count)")

.contains演算子を使用して、コレクション内の値をクエリできます。 個々の値を要素ごとに検索することも、範囲内を検索することもできます。

演算子
説明
.in(_ collection:)
式で参照されるプロパティが指定された配列に要素を含む場合、 trueと評価されます。
.contains(_ element:)
IN演算子と同等です。 式で参照されるプロパティに 値が含まれている場合は、 trueと評価されます。
.contains(_ range:)
BETWEEN演算子と同等です。 式で参照されるプロパティに範囲内の値が含まれている場合は、 trueと評価されます。
.containsAny(in: )
IN演算子とANY演算子を組み合わせたものと同等です。 指定された配列に含まれる要素がコレクション内に存在する場合、 trueと評価されます。

  • labels MutableSet コレクション プロパティに「quickwin」が含まれているタスクを見つけます。

  • progressMinutesプロパティが指定された分の範囲内にあるタスクを検索します。

let quickWinTasks = tasks.where {
$0.labels.contains("quick win")
}
print("Tasks labeled 'quick win': \(quickWinTasks.count)")
let progressBetween30and60 = tasks.where {
$0.progressMinutes.contains(30...60)
}
print("Tasks with progress between 30 and 60 minutes: \(progressBetween30and60.count)")

labels MutableSet コレクション プロパティに、指定された配列内の要素のいずれかが含まれているタスクを検索します(「qui順」または「バグ」)。

let quickWinOrBugTasks = tasks.where {
$0.labels.containsAny(in: ["quick win", "bug"])
}
print("Tasks labeled 'quick win' or 'bug': \(quickWinOrBugTasks.count)")

バージョン 10.23.0 の新機能: : IN演算子

Realm Swift クエリ API でIN演算子がサポートされるようになりました。 式で参照されるプロパティに 値が含まれている場合は、 trueと評価されます。

assigneeプロパティが名前のリストにあるかどうかを確認して、特定のチームメイト エイリアスまたはレイテンシに割り当てられたタスクを見つけます。

let taskAssigneeInAliOrJamie = tasks.where {
let assigneeNames = ["Ali", "Jamie"]
return $0.assignee.in(assigneeNames)
}
print("Tasks IN Ali or Jamie: \(taskAssigneeInAliOrJamie.count)")

Swift 論理演算子を使用して複合クエリを作成できます( &&!|| )。

クエリ言語の論理演算子を使用して、Ali の完了したタスクをすべて検索できます。 つまり、 assigneeプロパティ値が 'Ali' に等しく、かつisCompleteプロパティ値がtrueであるすべてのタスクを検索します。

let aliComplete = tasks.where {
($0.assignee == "Ali") && ($0.isComplete == true)
}
print("Ali's complete tasks: \(aliComplete.count)")

これらの string 演算子を使用して、string の値を比較できます。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。

注意

string 演算子では、次のオプションを使用できます。

  • .caseInsensitive 、大文字と小文字を区別しない

    $0.name.contains("f", options: .caseInsensitive)
  • .diacriticInsensitive 発音区別符号を区別しないため、Realm は特殊文字を基本文字として扱い(例: é -> e )。

    $0.name.contains("e", options: .diacriticInsensitive)
演算子
説明
.starts(with value: String)
コレクションに指定された string 値で始まる要素が含まれている場合、 trueと評価されます。
.contains(_ value: String)
左側のstring式が右側のstring式のどこにある場合は、true と評価されます。
.ends(with value: String)
コレクションに指定された string 値で値が終わる要素が含まれている場合、 trueと評価されます。
.like(_ value: String)

左側の string 式が右側の string ワイルドカード string 式と一致する場合、 trueと評価されます。 ワイルドカードstring式は、2 つの特殊なワイルドカード文字を含む通常の文字を使用するstringです。

  • *ワイルドカードは、0 個以上の任意の文字と一致します

  • ?ワイルドカードは任意の文字に一致します。

たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。

==
左側の文字列が右側のstringと辞書的に等しい場合、trueと評価されstring 。
!=
左側のstringが右側の文字列と辞書編集順に等しくない場合、trueと評価されstring 。

次の例では、クエリ エンジンの string 演算子を使用して次のものを検索します。

  • 名前が文字「e」で始まる名前のプロジェクト

  • 名前に「つまり」が含まれるプロジェクト

  • 値がAl?xに似たassigneeプロパティを持つプロジェクト

  • 発音区別符号を区別しない E のような文字を含むプロジェクト

// Use the .caseInsensitive option for case-insensitivity.
let startWithE = projects.where {
$0.name.starts(with: "e", options: .caseInsensitive)
}
print("Projects that start with 'e': \(startWithE.count)")
let containIe = projects.where {
$0.name.contains("ie")
}
print("Projects that contain 'ie': \(containIe.count)")
let likeWildcard = tasks.where {
$0.assignee.like("Al?x")
}
print("Tasks with assignees like Al?x: \(likeWildcard.count)")
// Use the .diacreticInsensitive option for diacritic insensitivty: contains 'e', 'E', 'é', etc.
let containElike = projects.where {
$0.name.contains("e", options: .diacriticInsensitive)
}
print("Projects that contain 'e', 'E', 'é', etc.: \(containElike.count)")

注意

stringソートと大文字と小文字を区別しないクエリは、「ラテン語の基本」、「ラテン語の追加」、「ラテン語の拡張 A」、および「ラテン語の拡張 B」の文字セットでのみサポートされます(UTF-8 範囲 0 ~ 591)。

バージョン 10.47.0 の新機能

geoWithin演算子を使用して、SDK の提供された形状のいずれかを持つ地理空間データをクエリします。

  • GeoCircle

  • GeoBox

  • GeoPolygon

この演算子は次の場合にtrueと評価されます。

  • オブジェクトには、Point の値を持つStringプロパティと、経度と緯度のペアを含むListを含む地理空間データ「シェイプ」があります。

  • 永続化されたオブジェクトの経度/緯度は、 地理空間クエリシェイプ 内に含まれます。

let companiesInSmallCircle = realm.objects(Geospatial_Company.self).where {
$0.location.geoWithin(smallCircle!)
}
print("Number of companies in small circle: \(companiesInSmallCircle.count)")

地理空間データのクエリの詳細については、「 地理空間データのクエリ 」を参照してください。

Realm オブジェクトのコレクション プロパティに集計演算子を適用できます。 集計演算子はコレクションを走査して、単一の値に縮小します。

演算子
説明
.avg
コレクション全体の特定の数値プロパティの平均値を評価します。
.count
指定されたコレクション内のオブジェクトの数を評価します。 これは現在、対多の関係コレクションでのみサポートされており、プリミティブのリストではサポートされていません。 プリミティブのリストで.countを使用するには、 Realm オブジェクトでプリミティブをラップすることを検討してください。
.max
コレクション全体で特定の数値プロパティの最も高い値を評価します。
.min
コレクション全体で特定の数値プロパティの最小値として評価されます。
.sum
コレクション全体の指定された数値プロパティの合計を評価します。

データのさまざまなファセットを表示するために、フィルターがいくつか作成されます。

  • タスクの平均優先順位が 5 を超えるプロジェクト。

  • 優先順位が 5 未満のタスクのみを含むプロジェクト。

  • すべてのタスクの優先順位が 5 を超えるプロジェクト。

  • 5 つを超えるタスクを含むプロジェクト。

  • 長時間実行されているプロジェクト。

let averageTaskPriorityAbove5 = projects.where {
$0.tasks.priority.avg > 5
}
print("Projects with average task priority above 5: \(averageTaskPriorityAbove5.count)")
let allTasksLowerPriority = projects.where {
$0.tasks.priority.max < 5
}
print("Projects where all tasks are lower priority: \(allTasksLowerPriority.count)")
let allTasksHighPriority = projects.where {
$0.tasks.priority.min > 5
}
print("Projects where all tasks are high priority: \(allTasksHighPriority.count)")
let moreThan5Tasks = projects.where {
$0.tasks.count > 5
}
print("Projects with more than 5 tasks: \(moreThan5Tasks.count)")
let longRunningProjects = projects.where {
$0.tasks.progressMinutes.sum > 100
}
print("Long running projects: \(longRunningProjects.count)")

セット演算子は、特定のルールを使用して、オブジェクトの特定のリストプロパティのすべての要素に特定のクエリ式を適用し、各入力コレクション オブジェクトを出力コレクションに渡すかどうかを決定します。

projectsコレクションで次のクエリを実行すると、次の値が返されます。

  • string labels のセットに「qui順」、「バグ」のいずれかが含まれているプロジェクト。

  • 整数ratingsのセット内のいずれかの要素が 3 より大きいプロジェクト。

let projectsWithGivenLabels = projects.where {
$0.tasks.labels.containsAny(in: ["quick win", "bug"])
}
print("Projects with quick wins: \(projectsWithGivenLabels.count)")
let projectsWithRatingsOver3 = projects.where {
$0.tasks.ratings > 3
}
print("Projects with any ratings over 3: \(projectsWithRatingsOver3.count)")

サブクエリを使用して、別のクエリでコレクション プロパティを反復処理できます。 サブクエリを作成するには、式を括弧で囲み、その直後に.count集計演算子を使用する必要があります。

(<query>).count > n

式が有効なサブクエリを生成しない場合は、実行時に例外が発生します。

projectsコレクションで次のクエリを実行すると、Alex という名前のユーザーによって完了していないタスクを含むプロジェクトが返されます。

let subquery = projects.where {
($0.tasks.isComplete == false && $0.tasks.assignee == "Alex").count > 0
}
print("Projects with incomplete tasks assigned to Alex: \(subquery.count)")

NPredate を使用してフィルターを構築できます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"progressMinutes > %@ AND name == %@", @1, @"Ali"];
let predicate = NSPredicate(format: "progressMinutes > 1 AND name == %@", "Ali")

フィルターは、NPredate ので構成されます。 式は、次のいずれかで構成されます。

  • 現在評価されているオブジェクトのプロパティの名前(キーパス)。

  • 演算子と最大 2 つの引数式(s)。

  • string ('hello')や数値(5)などの値。

オブジェクト プロパティを参照する場合、ドット表記を使用してそのオブジェクトの子プロパティを参照できます。 ドット表記で埋め込みオブジェクト関係のプロパティを参照することもできます。

たとえば、ワークプレイス オブジェクトを参照するworkplaceプロパティを持つオブジェクトに対するクエリを考えてみましょう。 ワークプレイス オブジェクトには、埋め込みオブジェクト プロパティaddressがあります。 ドット表記を連鎖させて、その住所の郵便番号プロパティを参照できます。

workplace.address.zipcode == 10012

述語形式の string では、次の置換を使用できます。

[NSPredicate predicateWithFormat:@"%K > %@ AND %K == %@", @"progressMinutes", @1, @"name", @"Ali"];
NSPredicate(format: "%K > %@ AND %K == %@", "progressMinutes", NSNumber(1), "name", "Ali")

Realm コレクションをフィルタリングするために使用できる演算子にはいくつかのタイプがあります。 フィルターは、フィルタリングされるコレクション内のすべてのオブジェクトの演算子式を評価することで機能します。 式がtrueに解決される場合、Realm Database は結果コレクションにオブジェクトを含めます。

検索の最も簡単な操作は、値を比較することです。

重要

タイプは一致する必要があります

演算子の両方の型は等しくなければなりません。 たとえば、 ObjectId を stringと比較すると、前提条件が失敗し、次のようなメッセージが表示されます。

"Expected object of type object id for property 'id' on object of type
'User', but received: 11223344556677889900aabb (Invalid value)"

任意の数値型を他の任意の数値型と比較できます。

演算子
説明
between
左側の数値式または日付式が右側の範囲と等しい場合、 trueと評価されます。 日付の場合、左側の日付が右側の日付範囲内にある場合、これはtrueと評価されます。
==, =
左側の式が右側の式と等しい場合は、 trueと評価されます。
>
左側の数値または日付式が右側の数値または日付式より大きい場合は、 trueと評価されます。 日付の場合、左側の日付が右側の日付より後の場合、これはtrueと評価されます。
>=
左側の数値または日付式が右側の数値または日付式より大きい場合、 trueと評価されます。 日付の場合、左側の日付が右側の日付より後のか同じである場合、これはtrueと評価されます。
in
左側の式が右側のリストまたは string にある場合、 trueと評価されます。
<
左側の数値または日付式が右側の数値または日付式より小さい場合は、 trueと評価されます。 日付の場合、左側の日付が右側の日付よりも前の場合、これはtrueと評価されます。
<=
左側の数値式が右側の数値式より小さい場合、 trueと評価されます。 日付の場合、左側の日付が右側の日付よりも前の日付または同じ日付の場合、これはtrueと評価されます。
!=, <>
左側の式が右側の式と等しくない場合、 trueと評価されます。

次の例では、クエリ エンジンの比較演算子を使用して次のようにします。

  • priorityプロパティ値の値をしきい値と比較して、優先順位の高いタスクを見つけます。どの優先順位を超えると、優先順位が高いと見なされます。

  • progressMinutesプロパティが一定の値以上であるかどうかを確認して、実行時間が長いタスクを見つけます。

  • assigneeプロパティがnullに等しいタスクを見つけて、割り当てられていないタスクを見つけます。

  • assigneeプロパティが名前のリストにあるかどうかを確認して、特定のチームメイト エイリアスまたはレイテンシに割り当てられたタスクを見つけます。

NSLog(@"High priority tasks: %lu",
[[tasks objectsWithPredicate:[NSPredicate predicateWithFormat:@"priority > %@", @5]] count]);
NSLog(@"Short running tasks: %lu",
[[tasks objectsWhere:@"progressMinutes between {1, 15}"] count]);
NSLog(@"Unassigned tasks: %lu",
[[tasks objectsWhere:@"assignee == nil"] count]);
NSLog(@"Ali or Jamie's tasks: %lu",
[[tasks objectsWhere:@"assignee IN {'Ali', 'Jamie'}"] count]);
NSLog(@"Tasks with progress between 30 and 60 minutes: %lu",
[[tasks objectsWhere:@"progressMinutes BETWEEN {30, 60}"] count]);
let highPriorityTasks = tasks.filter("priority > 5")
print("High priority tasks: \(highPriorityTasks.count)")
let longRunningTasks = tasks.filter("progressMinutes > 120")
print("Long running tasks: \(longRunningTasks.count)")
let unassignedTasks = tasks.filter("assignee == nil")
print("Unassigned tasks: \(unassignedTasks.count)")
let aliOrJamiesTasks = tasks.filter("assignee IN {'Ali', 'Jamie'}")
print("Ali or Jamie's tasks: \(aliOrJamiesTasks.count)")
let progressBetween30and60 = tasks.filter("progressMinutes BETWEEN {30, 60}")
print("Tasks with progress between 30 and 60 minutes: \(progressBetween30and60.count)")

論理演算子を使用して複合述語を作成できます。

演算子
説明
and
&&
左側の式と右側の式の両方がtrueである場合は、 trueと評価されます。
not
!
指定された式の結果を否定します。
or
||
いずれかの式がtrueを返す場合、 trueと評価されます。

クエリ言語の論理演算子を使用して、Ali の完了したタスクをすべて検索できます。 つまり、 assigneeプロパティ値が 'Ali' に等しく、かつisCompleteプロパティ値がtrueであるすべてのタスクを検索します。

NSLog(@"Ali's complete tasks: %lu",
[[tasks objectsWhere:@"assignee == 'Ali' AND isComplete == true"] count]);
let aliComplete = tasks.filter("assignee == 'Ali' AND isComplete == true")
print("Ali's complete tasks: \(aliComplete.count)")

これらの string 演算子を使用して、string の値を比較できます。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。

注意

string 演算子では、次の修飾子を使用できます。

  • [c] 、大文字と小文字を区別しない

    [NSPredicate predicateWithFormat: @"name CONTAINS[c] 'f'"]
    NSPredicate(format: "name CONTAINS[c] 'f'")
  • [d] 発音区別符号を区別しないため、Realm は特殊文字を基本文字として扱い(例: é -> e )。

    [NSPredicate predicateWithFormat: @"name CONTAINS[d] 'e'"]
    NSPredicate(format: "name CONTAINS[d] 'e'")
演算子
説明
beginsWith
左側の文字string式が右側のstring式で始まる場合は、true と評価されます。 これは contains と似ていますが、右側のstring式が左側の文字string式の先頭にある場合にのみ一致します。
contains, in
左側のstring式が右側のstring式のどこにある場合は、true と評価されます。
endsWith
左側の文字string式が右側のstring式で終わる場合は、true と評価されます。 これは contains と似ていますが、左側のstring式が右側のstring式の最後に見つかった場合にのみ一致します。
like

左側の string 式が右側の string ワイルドカード string 式と一致する場合、 trueと評価されます。 ワイルドカードstring式は、2 つの特殊なワイルドカード文字を含む通常の文字を使用するstringです。

  • *ワイルドカードは、0 個以上の任意の文字と一致します

  • ?ワイルドカードは任意の文字に一致します。

たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。

==, =
左側の文字列が右側のstringと辞書的に等しい場合、trueと評価されstring 。
!=, <>
左側のstringが右側の文字列と辞書編集順に等しくない場合、trueと評価されstring 。

クエリ エンジンの string 演算子を使用して、名前が文字「e」で始まるプロジェクトと、名前に「ie」が含まれるプロジェクトを検索します。

// Use [c] for case-insensitivity.
NSLog(@"Projects that start with 'e': %lu",
[[projects objectsWhere:@"name BEGINSWITH[c] 'e'"] count]);
NSLog(@"Projects that contain 'ie': %lu",
[[projects objectsWhere:@"name CONTAINS 'ie'"] count]);
// Use [c] for case-insensitivity.
let startWithE = projects.filter("name BEGINSWITH[c] 'e'")
print("Projects that start with 'e': \(startWithE.count)")
let containIe = projects.filter("name CONTAINS 'ie'")
print("Projects that contain 'ie': \(containIe.count)")
// [d] for diacritic insensitivty: contains 'e', 'E', 'é', etc.
let containElike = projects.filter("name CONTAINS[cd] 'e'")
print("Projects that contain 'e', 'E', 'é', etc.: \(containElike.count)")

注意

stringソートと大文字と小文字を区別しないクエリは、「ラテン語の基本」、「ラテン語の追加」、「ラテン語の拡張 A」、および「ラテン語の拡張 B」の文字セットでのみサポートされます(UTF-8 範囲 0 ~ 591)。

バージョン 10.47.0 の新機能

SDK に指定されたシェイプのいずれかでIN演算子を使用して、地理空間クエリを実行できます。

  • GeoCircle

  • GeoBox

  • GeoPolygon

この演算子は次の場合にtrueと評価されます。

  • オブジェクトには、Point の値を持つStringプロパティと、経度と緯度のペアを含むListを含む地理空間データ「シェイプ」があります。

  • 永続化されたオブジェクトの経度/緯度は、 地理空間クエリシェイプ 内に含まれます。

let filterArguments = NSMutableArray()
filterArguments.add(largeBox)
let companiesInLargeBox = realm.objects(Geospatial_Company.self)
.filter(NSPredicate(format: "location IN %@", argumentArray: filterArguments as? [Any]))
print("Number of companies in large box: \(companiesInLargeBox.count)")

地理空間データのクエリの詳細については、「 地理空間データのクエリ 」を参照してください。

Realm オブジェクトのコレクション プロパティに集計演算子を適用できます。 集計演算子はコレクションを走査して、単一の値に縮小します。

演算子
説明
@avg
コレクション全体の特定の数値プロパティの平均値を評価します。
@count
指定されたコレクション内のオブジェクトの数を評価します。 これは現在、対多の関係コレクションでのみサポートされており、プリミティブのリストではサポートされていません。 プリミティブのリストで@countを使用するには、 Realm オブジェクトでプリミティブをラップすることを検討してください。
@max
コレクション全体で特定の数値プロパティの最も高い値を評価します。
@min
コレクション全体で特定の数値プロパティの最小値として評価されます。
@sum
コレクション全体の指定された数値プロパティの合計を評価します。

データのさまざまなファセットを表示するために、フィルターがいくつか作成されます。

  • タスクの平均優先順位が 5 を超えるプロジェクト。

  • 長時間実行されているプロジェクト。

NSLog(@"Projects with average tasks priority above 5: %lu",
[[projects objectsWhere:@"tasks.@avg.priority > 5"] count]);
NSLog(@"Projects where all tasks are lower priority: %lu",
[[projects objectsWhere:@"tasks.@max.priority < 5"] count]);
NSLog(@"Projects where all tasks are high priority: %lu",
[[projects objectsWhere:@"tasks.@min.priority > 5"] count]);
NSLog(@"Projects with more than 5 tasks: %lu",
[[projects objectsWhere:@"tasks.@count > 5"] count]);
NSLog(@"Long running projects: %lu",
[[projects objectsWhere:@"tasks.@sum.progressMinutes > 100"] count]);
let averageTaskPriorityAbove5 = projects.filter("tasks.@avg.priority > 5")
print("Projects with average task priority above 5: \(averageTaskPriorityAbove5.count)")
let allTasksLowerPriority = projects.filter("tasks.@max.priority < 5")
print("Projects where all tasks are lower priority: \(allTasksLowerPriority.count)")
let allTasksHighPriority = projects.filter("tasks.@min.priority > 5")
print("Projects where all tasks are high priority: \(allTasksHighPriority.count)")
let moreThan5Tasks = projects.filter("tasks.@count > 5")
print("Projects with more than 5 tasks: \(moreThan5Tasks.count)")
let longRunningProjects = projects.filter("tasks.@sum.progressMinutes > 100")
print("Long running projects: \(longRunningProjects.count)")

セット演算子は、特定のルールを使用して、オブジェクトの特定のリストプロパティのすべての要素に特定の述語を適用し、各入力コレクション オブジェクトを出力コレクションに渡すかどうかを決定します。

演算子
説明
ALL
コレクション内のすべてのオブジェクトに対して述語がtrueと評価されるオブジェクトを返します。
ANY, SOME
コレクション内のすべてのオブジェクトに対して述語がtrueと評価するオブジェクトを返します。
NONE
コレクション内のすべてのオブジェクトに対して述語が false と評価されるオブジェクトを返します。

クエリ エンジンのセット演算子を使用して、以下を検索します。

  • 完了したタスクがないプロジェクト。

  • 最優先順位のタスクがあるプロジェクト。

NSLog(@"Projects with no complete tasks: %lu",
[[projects objectsWhere:@"NONE tasks.isComplete == true"] count]);
NSLog(@"Projects with any top priority tasks: %lu",
[[projects objectsWhere:@"ANY tasks.priority == 10"] count]);
let noCompleteTasks = projects.filter("NONE tasks.isComplete == true")
print("Projects with no complete tasks: \(noCompleteTasks.count)")
let anyTopPriorityTasks = projects.filter("ANY tasks.priority == 10")
print("Projects with any top priority tasks: \(anyTopPriorityTasks.count)")

SUBQUERY()述語関数を使用して、コレクション プロパティを別のクエリで反復処理できます。 SUBQUERY()の署名は次のとおりです。

SUBQUERY(<collection>, <variableName>, <predicate>)
  • collection: 反復処理するリスト プロパティの名前

  • variableName: サブクエリで使用する現在の要素の変数名

  • predicate: サブクエリ述語を含む string。 現在反復処理されている要素は、 variableNameで指定された変数名で使用できます。

projectsコレクションで次のフィルターを実行すると、Alex という名前のユーザーによって完了していないタスクが返されます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SUBQUERY(tasks, $task, $task.isComplete == %@ AND $task.assignee == %@).@count > 0",
@NO,
@"Alex"];
NSLog(@"Projects with incomplete tasks assigned to Alex: %lu",
[[projects objectsWithPredicate:predicate] count]);
let predicate = NSPredicate(
format: "SUBQUERY(tasks, $task, $task.isComplete == false AND $task.assignee == %@).@count > 0", "Alex")
print("Projects with incomplete tasks assigned to Alex: \(projects.filter(predicate).count)")

戻る

スレッド化