RQL
項目一覧
- Realm SDK によるクエリ
- このページの例
- 式
- パラメーター化されたクエリ
- クエリ形式
- ドット表記
- nil 型
- 比較演算子
- 論理演算子
- string演算子
- ObjectId 演算子と UUID 演算子
- 算術演算子
- 型演算子
- 辞書演算子
- 日付演算子
- 集計演算子
- コレクション 演算子
- リストの比較
- 全文検索
- 全文検索トークナイザの詳細
- 地理空間クエリ
- バックリンク クエリ
- サブクエリ
- ソート、個別、制限
- Flexible Sync RQL の制限
- インデックス付きクエリ可能なフィールドのサブスクリプション要件
- Flexible Sync でサポートされていないクエリ演算子
- クエリをリストする
- 埋め込みオブジェクトまたはリンクされたオブジェクト
- クエリ サイズの制限
RQL ( RQL )は、Realm からオブジェクトを取得するときに検索を制限する string ベースのクエリ言語です。 SDK 固有のメソッドは Realm クエリ エンジンにクエリを渡します。これにより、Realm から一致するオブジェクトが検索されます。 RQL構文は NSP に基づいています。
クエリは、クエリ対象のコレクション内のすべてのオブジェクトの述語を評価します。 述語が true
と解決される場合、結果コレクションには オブジェクトが含まれます。
SDK のフィルターまたはクエリ メソッドを使用して、ほとんどのRQL SDK で を使用できます。RealmSwift SDK は例外であり、 NPredify クエリ APIを使用します。 一部の SDK は、言語で Realm をクエリするための慣用的な API もサポートしています。
Realm SDK によるクエリ
Realm をクエリするための SDK 固有のメソッドの詳細については、 SDK のドキュメントを参照してください。
C++ SDK は現在、RQL のサブセットのみを実装しています。 C++ SDK で Realm をクエリする例については、以下を参照してください。
注意
Swift SDKはRQLをサポートしていません
Swift SDKはRQLを使用したクエリをサポートしていません。 代わりに、NSPredate を使用して Realm をクエリできます。 Swift SDK で Realm をクエリする例については、「データのフィルタリング - Swift SDK 」を参照してください。
RQLを使用してRealm Studio内のデータを参照することもできます。 Realm Studio は、Realm ファイルを表示、編集、設計するためのビジュアル ツールです。
このページの例
このページの例の多くでは、ToDo リスト アプリに単純なデータセットを使用しています。 2 つの Realm オブジェクトタイプはProject
とItem
です。
Item
には、名前、割り当て者の名前、完了したフラグがあります。 また、優先順位(値が大きいほど重要)と、その作業に費やされた時間数もあります。Project
には 0 個以上のItems
と、完了が予想される ToDo 項目の最小数に対する任意の割り当てがあります。
これらの 2 つのクラス、 Project
とItem
のスキーマを以下で参照してください。
public class Item extends RealmObject { ObjectId id = new ObjectId(); String name; Boolean isComplete = false; String assignee; Integer priority = 0; Integer progressMinutes = 0; final RealmResults<Project> projects = null; } public class Project extends RealmObject { ObjectId id = new ObjectId(); String name; RealmList<Item> items; Integer quota = null; }
open class Item(): RealmObject() { var id: ObjectId = new ObjectId() lateinit var name: String var isComplete: Boolean = false var assignee: String? = null var priority: Int = 0 var progressMinutes: Int = 0 } open class Project(): RealmObject() { var id: ObjectId = new ObjectId() lateinit var name: String lateinit var items: RealmList<Item> var quota: Int? = null }
public class Item : RealmObject { [ ] [ ] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); [ ] [ ] public string Name { get; set; } [ ] public bool IsComplete { get; set; } = false; [ ] public string Assignee { get; set; } [ ] public int Priority { get; set; } = 0; [ ] public int ProgressMinutes { get; set; } = 0; [ ] [ ] public IQueryable<Project> Projects { get; } } public class Project : RealmObject { [ ] [ ] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); [ ] public string Name { get; set; } [ ] public IList<Item> Items { get; } [ ] public int Quota { get; set; } }
const ItemModel = { name: "Item", properties: { id: "objectId", name: {type: "string", indexed: "full-text"}, isComplete: { type: "bool", default: false }, assignee: "string?", priority: { type: "int", default: 0, }, progressMinutes: { type: "int", default: 0, }, projects: { type: "linkingObjects", objectType: "Project", property: "items", }, }, primaryKey: "id", }; const ProjectModel = { name: "Project", properties: { id: "objectId", name: "string", items: "Item[]", quota: "int?", }, primaryKey: "id", };
const ItemModel = { name: "Item", properties: { id: "objectId", name: {type: "string", indexed: "full-text"}, isComplete: { type: "bool", default: false }, assignee: "string?", priority: { type: "int", default: 0, }, progressMinutes: { type: "int", default: 0, }, projects: { type: "linkingObjects", objectType: "Project", property: "items", }, }, primaryKey: "id", }; const ProjectModel = { name: "Project", properties: { id: "objectId", name: "string", items: "Item[]", quota: "int?", }, primaryKey: "id", };
class Item(): RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var isComplete: Boolean = false var assignee: String? = null var priority: Int = 0 var progressMinutes: Int = 0 } class Project(): RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var items: RealmList<Item> = realmListOf<Item>() var quota: Int? = null }
part 'models.realm.dart'; ()class _Project { "_id") ( () late ObjectId id; late String name; late List<_Item> items; int? quota; } ()class _Item { "_id") ( () late ObjectId id; (RealmIndexType.fullText) late String name; bool isComplete = false; String? assignee; int priority = 0; int progressMinutes = 0; }
式
フィルターは、述語内の式で構成されます。 式は、次のいずれかで構成されます。
現在評価されているオブジェクトのプロパティの名前。
演算子と最大 2 つの引数式(s)。 たとえば、式
A + B
では、A + B
の全体が 式 ですが、A
とB
は演算子+
の引数式でもあります。string (
'hello'
)や数値(5
)などの値。
"progressMinutes > 1 AND assignee == $0", "Ali"
パラメーター化されたクエリ
準備されたRQLステートメントに変数を挿入するためのパラメーター付きクエリを作成します。 補間変数の構文は$<int>
から始まる0
です。Realmを使用する SDKRQL メソッドに、位置引数を追加の引数として渡します。
$0
に 1 つのパラメータのみを含めます。
"progressMinutes > 1 AND assignee == $0", "Ali"
$0
から始まる昇順の整数を持つ複数のパラメータを含めます。
"progressMinutes > $0 AND assignee == $1", 1, "Alex"
クエリ形式
次の表は、次のデータ型に対してシリアル化およびパラメータ化するときに、クエリをどのようにフォーマットする必要があるかを示しています。
タイプ | パラメーター化された例 | 直列化された例 | 注意 |
---|---|---|---|
ブール値 | "setting ==$0"、false | "setting ==false" | true またはfalse 値。 |
"name == $0", "Geoorg" | "name == 'Geoge'" | string とchar データ型に適用されます。 | |
"age > $0"、5.50 | "age > 5.50" | int 、 short 、 long 、 double 、 Decimal128 、 float データ型に適用されます。 | |
"date < $0", dateObject | "date < 2021-02-20@17:30:15:0" | パラメーター化された日付クエリの場合は、日付オブジェクトを渡す必要があります。 シリアル化された日付クエリの場合、次の形式で日付を表すことができます。
| |
"_id == $0", oidValue | "_id == oid(507f1f77bcf86cd799439011)" | パラメーター化された ObjectId クエリの場合は、 ObjectId を渡す必要があります。 シリアル化された ObjectId クエリの場合、string 表現は oid(<ObjectId String>) です。 | |
"id == $0", uuidValue | "id == uuid(d1b186e1-e9e0-4768-a1a7-c492519d47ee)" | パラメーター化された UUID クエリの場合は、UUID を渡す必要があります。 シリアル化された UUID クエリの場合、string 表現は uuid(<UUID String>) です。 | |
バイナリ | "value == $0", "binary" | "value == 'binary'" | ASCII 文字の場合、RQL は string のようにバイナリ値を引用符で直列化します。 印刷できない文字の場合、RQL はバイナリを 64 進数に直列化します。 |
"Any items.name =={$0, $1}", "milk", "bread" | 「任意の items.name =={'milk','bread'}」 | リスト、コレクション、セットに適用されます。 リストの各ノードには、パラメーター化された値を使用する必要があります。 | |
RealmObject | "A任意のアイテム == $0",obj("Item", oid(6489f036f7bd0546377303ab)) | "Any items ==obj('Item', oid(6489f036f7bd054637303ab)" | RealmObject で渡すには、オブジェクトのクラスとプライマリキーが必要です。 |
ドット表記
オブジェクト プロパティを参照する場合、ドット表記を使用してそのオブジェクトの子プロパティを参照できます。 ドット表記で埋め込みオブジェクトと関係のプロパティを参照することもできます。
たとえば、ワークプレイス オブジェクトを参照するworkplace
プロパティを持つオブジェクトに対するクエリを考えてみましょう。 ワークプレイス オブジェクトには、埋め込みオブジェクト プロパティaddress
があります。 ドット表記を連鎖させて、その住所の郵便番号プロパティを参照できます。
"workplace.address.zipcode == 10019"
nil 型
RQLには、null ポインターを表す nil
型が含まれます。 nil
は、クエリで直接参照することも、パラメータ化されたクエリを使用して参照することもできます。 パラメータ化されたクエリを使用している場合、各 SDK はそれぞれの null ポインターをnil
にマッピングします。
"assignee == nil"
// comparison to language null pointer "assignee == $0", null
比較演算子
検索の最も簡単な操作は、値を比較することです。
重要
タイプは一致する必要があります
演算子の両方の型は等しくなければなりません。 たとえば、 ObjectId を string と比較すると、前提条件が失敗し、次のようなメッセージが表示されます。
"Expected object of type object id for property 'id' on object of type 'User', but received: 11223344556677889900aabb (Invalid value)"
任意の数値型を、小数、浮動小数、Decimal128 などの他の数値型と比較できます。
演算子 | 説明 |
---|---|
BETWEEN {number1, number2} | 左側の数値式または日付式が右側の範囲と等しい場合、 true と評価されます。 日付の場合、左側の日付が右側の日付範囲内にある場合、これはtrue と評価されます。 |
== , = | 左側の式が右側の式と等しい場合は、 true と評価されます。 |
> | 左側の数値または日付式が右側の数値または日付式より大きい場合は、 true と評価されます。 日付の場合、左側の日付が右側の日付より後の場合、これはtrue と評価されます。 |
>= | 左側の数値または日付式が右側の数値または日付式より大きい場合、 true と評価されます。 日付の場合、左側の日付が右側の日付より後のか同じである場合、これはtrue と評価されます。 |
IN | 左側の式が右側のリストにある場合は、 true と評価されます。 これは と同等であり、 == ANY の省略形として使用されます。 |
< | 左側の数値または日付式が右側の数値または日付式より小さい場合は、 true と評価されます。 日付の場合、左側の日付が右側の日付よりも前の場合、これはtrue と評価されます。 |
<= | 左側の数値式が右側の数値式より小さい場合、 true と評価されます。 日付の場合、左側の日付が右側の日付よりも前の日付または同じ日付の場合、これはtrue と評価されます。 |
!= , <> | 左側の式が右側の式と等しくない場合、 true と評価されます。 |
例
次の例では、 RQLの比較演算子を使用して次のようにします。
priority
プロパティ値の値をしきい値と比較して、優先順位の高い ToDo 項目を見つけます。どの優先順位を超えると、優先順位が高いと見なされます。progressMinutes
プロパティが一定の値以上であるかどうかを確認して、実行時間が長い ToDo 項目を見つけます。assignee
プロパティがnull
と等しいアイテムを見つけて、割り当てられていない ToDo アイテムを見つけます。progressMinutes
プロパティが 2 つの数値の間にあるアイテムを見つけることで、特定の時間範囲内の ToDo アイテムを検索します。指定されたリストから、特定の量の
progressMinutes
を持つ To Do 項目を見つけます。
// Find high priority to-do items by comparing the value of the ``priority`` // property value with a threshold number, above which priority can be considered high. "priority > $0", 5 // Find long-running to-do items by seeing if the progressMinutes property is at or above a certain value. "progressMinutes > $0", 120 // Find unassigned to-do items by finding items where the assignee property is equal to null. "assignee == $0", null // Find to-do items within a certain time range by finding items // where the progressMinutes property is between two numbers. "progressMinutes BETWEEN { $0 , $1 }", 30, 60 // Find to-do items with a certain amount of progressMinutes from the given list. "progressMinutes IN { $0, $1, $2, $3, $4, $5 }", 10, 20, 30, 40, 50, 60
論理演算子
論理演算子を使用して複合述語を作成します。
演算子 | 説明 |
---|---|
AND && | 左側の式と右側の式の両方が true である場合は、 true と評価されます。 |
NOT ! | 指定された式の結果を否定します。 |
OR || | いずれかの式が true を返す場合、 true と評価されます。 |
例
クエリ言語の論理演算子を使用して、Ali の完了した ToDo 項目をすべて検索できます。 つまり、 assignee
プロパティ値が 'Ali' に等しく、かつisComplete
プロパティ値がtrue
であるすべてのアイテムを検索します。
"assignee == $0 AND isComplete == $1", "Ali", true
string演算子
これらの string 演算子を使用して string 値を比較します。 正規表現のようなワイルドカードを使用すると、検索の柔軟性が向上します。
注意
string 演算子では、次の修飾子を使用できます。
[c]
、大文字と小文字を区別しない"name CONTAINS[c] $0", 'a'
演算子 | 説明 |
---|---|
BEGINSWITH | 左側の文字string式が右側のstring式で始まる場合は、 true と評価されます。 これは contains と似ていますが、右側のstring式が左側の文字string式の先頭にある場合にのみ一致します。 |
CONTAINS | 右側のstring式が左側の文字string式のどこにでも見つかった場合は、 true と評価されます。 |
ENDSWITH | 左側の文字string式が右側のstring式で終わる場合は、 true と評価されます。 これは contains と似ていますが、左側のstring式が右側のstring式の最後に見つかった場合にのみ一致します。 |
LIKE | 左側の string 式が右側の string ワイルドカード string 式と一致する場合、
たとえば、ワイルドカードstring 「d?g」は、「dog」、「dig」、および「dgs」と一致しますが、「ding」、「dg」、または「adog」には一致しません。 |
== , = | 左側の文字列が右側のstringと辞書的に等しい場合、 true と評価されstring 。 |
!= , <> | 左側のstringが右側の文字列と辞書編集順に等しくない場合、 true と評価されstring 。 |
例
クエリ エンジンの string 演算子を使用して、次のものを見つけます。
名前が文字「e」で始まる名前のプロジェクト
名前に「つまり」が含まれるプロジェクト
"name BEGINSWITH[c] $0", 'e' "name CONTAINS $0", 'ie'
ObjectId 演算子と UUID 演算子
BSON ObjectIdとUUIDをクエリします。 これらのデータ型は、プライマリキーとしてよく使用されます。
ObjectId を使用してクエリを実行するには、 パラメーター化されたクエリ を使用します。 クエリ対象の ObjectId または UUID を引数として渡します。
"_id == $0", oidValue
また、評価対象の ObjectId の string 表現をoid(<ObjectId String>)
に配置することもできます。
"_id == oid(6001c033600510df3bbfd864)"
UUID を使用してクエリするには、評価する UUID のstring表現を uuid(<UUID String>)
に配置します。
"id == uuid(d1b186e1-e9e0-4768-a1a7-c492519d47ee)"
演算子 | 説明 |
---|---|
== , = | 左側の値が右側の値と等しい場合は、 true と評価されます。 |
!= , <> | 左側の値が右側の値と等しくない場合、 true と評価されます。 |
算術演算子
数値データ型を評価するときに、RQL 式の一方の側で基本的な算術演算を実行します。
"2 * priority > 6" // Is equivalent to "priority >= 2 * (2 - 1) + 2"
数学操作で複数のオブジェクト プロパティを一緒に使用することもできます。
"progressMinutes * priority == 90"
演算子 | 説明 |
---|---|
* | 乗算。 |
/ | 部門。 |
+ | 追加。 |
- | 減算。 |
() | 式をまとめてグループ化します。 |
型演算子
@type
演算子を使用してプロパティの型を確認します。 型演算子は、型と辞書が混在する場合のみ使用できます。
データ型名の string 表現に対してプロパティを評価します。 SDK 言語のデータ型から Realm データ型へのマッピングについては、SDK ドキュメントを参照してください。
演算子 | 説明 |
---|---|
@type | プロパティのタイプがプロパティ名を string であるかどうかを確認します。 等価性を比較するには、 == と!= を使用します。 |
"mixedType.@type == 'string'" "mixedType.@type == 'bool'"
辞書演算子
これらの辞書演算子を使用して、辞書値を比較します。
演算子 | 説明 |
---|---|
@values | 右側の式で指定された値を持つオブジェクトを返します。 |
@keys | 右側の式で指定されたキーを持つオブジェクトを返します。 |
@size , @count | 辞書内の要素の数。 |
Dictionary['key'] | 辞書のキーの値にアクセスします。 |
ALL | ANY | NONE <property>.@type | 辞書に特定のタイプのプロパティが含まれているかどうかを確認します。 |
また、辞書演算子を比較演算子と組み合わせて使用し、辞書キーと値に基づいてオブジェクトをフィルタリングすることもできます。 次の例は、比較演算子とともに辞書演算子を使用する方法の一部を示しています。 すべての例では、 dict
という名前の辞書プロパティを持つ Realm オブジェクトのコレクションがクエリされます。
例
次の例では、さまざまな辞書演算子を使用しています。
// Evaluates if there is a dictionary key with the name 'foo' "ANY dict.@keys == $0", 'foo' // Evaluates if there is a dictionary key with key 'foo' and value 'bar "dict['foo'] == $0", 'bar' // Evaluates if there is greater than one key-value pair in the dictionary "dict.@count > $0", 1 // Evaluates if dictionary has property of type 'string' "ANY dict.@type == 'string'" // Evaluates if all the dictionary's values are integers "ALL dict.@type == 'bool'" // Evaluates if dictionary does not have any values of type int "NONE dict.@type == 'double'" // ANY is implied. "dict.@type == 'string'"
日付演算子
Realm 内の日付型をクエリします。
一般的に、使用している SDK 言語からクエリに日付データ型を渡すには、パラメーター化されたクエリを使用する必要があります。
"timeCompleted < $0", someDate
次の 2 つの方法で日付を指定することもできます。
特定の日付として(UTC)-
YYYY-MM-DD@HH:mm:ss:nnnnnnnnnn
(year-month-day@hours:minutes:nanoseconds)、UTC 日付と時刻を区別するために、@
の代わりにT
を使用することもできます。UNIXエポック からの時間(秒単位) -
Ts:n
。T
は時間の開始を指定し、s
は秒数、n
はナノ秒数。
Date は比較演算子をサポートします。
例
次の例は、日付オブジェクトとともにパラメーター化されたクエリを使用する方法を示しています。
var date = new Date("2021-02-20@17:30:15:0"); "timeCompleted > $0", date
集計演算子
Realm オブジェクトのコレクション プロパティに集計演算子を適用します。 集計演算子はコレクションを走査して、単一の値に縮小します。
演算子 | 説明 |
---|---|
@avg | コレクション全体の特定の数値プロパティの平均値を評価します。 いずれかの値が null である場合、それらは結果にはカウントされません。 |
@count | 指定されたコレクション内のオブジェクトの数を評価します。 |
@max | コレクション全体で特定の数値プロパティの最も高い値を評価します。 null 値は無視されます。 |
@min | コレクション全体で特定の数値プロパティの最小値として評価されます。 null 値は無視されます。 |
@sum | コレクション全体の特定の数値プロパティの合計に対して評価されます null 値は含まれません)。 |
例
これらの例ではすべて、この条件を満たす ToDo 項目を含むプロジェクトをクエリします。
平均的なアイテムの優先順位が 5 を超えるプロジェクト。
優先順位が 5 未満のアイテムを含むプロジェクト。
優先順位が 5 を超えるアイテムを含むプロジェクト。
5 つを超えるアイテムを持つプロジェクト。
長時間実行されるアイテムを含むプロジェクト。
var priorityNum = 5; "items.@avg.priority > $0", priorityNum "items.@max.priority < $0", priorityNum "items.@min.priority > $0", priorityNum "items.@count > $0", 5 "items.@sum.progressMinutes > $0", 100
コレクション 演算子
コレクション演算子を使用すると、オブジェクトのコレクション内のリスト プロパティをクエリできます。 コレクション演算子は、オブジェクトの特定のリスト プロパティのすべての要素に述語を適用してコレクションをフィルタリングします。 述語が true を返す場合、オブジェクトは出力コレクションに含まれます。
演算子 | 説明 |
---|---|
ALL | コレクション内のすべてのオブジェクトに対して述語が true と評価されるオブジェクトを返します。 |
ANY , SOME | コレクション内のすべてのオブジェクトに対して述語が true と評価するオブジェクトを返します。 |
NONE | コレクション内のすべてのオブジェクトに対して述語が false と評価されるオブジェクトを返します。 |
例
この例では、コレクション演算子を使用して、特定の条件に一致する ToDo 項目を含むプロジェクトを検索します。
// Projects with no complete items. "NONE items.isComplete == $0", true // Projects that contain a item with priority 10 "ANY items.priority == $0", 10 // Projects that only contain completed items "ALL items.isComplete == $0", true // Projects with at least one item assigned to either Alex or Ali "ANY items.assignee IN { $0 , $1 }", "Alex", "Ali" // Projects with no items assigned to either Alex or Ali "NONE items.assignee IN { $0 , $1 }", "Alex", "Ali"
リストの比較
比較演算子とコレクション演算子を使用して、データのリストに基づいてフィルタリングできます。
任意のタイプの有効なリストを比較できます。 これには以下が含まれます。
Realm オブジェクトのコレクション。Realm 内の他のデータをフィルタリングできます。
"oid(631a072f75120729dc9223d9) IN items.id" はクエリで直接定義されるリストを表示し、静的データをフィルタリングできます。 静的リストは、開始括弧(
{
)と閉じ括弧(}
)で囲まれたリテラル値のカンマ区切りリストとして定義します。"priority IN {0, 1, 2}" パラメータ化された式で渡されるネイティブ リスト オブジェクト。これにより、アプリケーション データをクエリに直接渡すことができます。
const ids = [ new BSON.ObjectId("631a072f75120729dc9223d9"), new BSON.ObjectId("631a0737c98f89f5b81cd24d"), new BSON.ObjectId("631a073c833a34ade21db2b2"), ]; const parameterizedQuery = realm.objects("Item").filtered("id IN $0", ids);
コレクション演算子を定義しない場合、リスト式はデフォルトでANY
演算子になります。
例
これらの 2 つのリストクエリは同等です。
age == ANY {18, 21}
age == {18, 21}
これらのクエリではどちらも、経過時間プロパティが 18 または 21 に等しいオブジェクトを返します。 ステージが 18 または 21 と等しくない場合にのみ オブジェクトを返すという逆の操作も可能です。
age == NONE {18, 21}
次の表には、コレクション演算子がリストおよび比較演算子とどのように相互作用するのかを示す例えが含まれています。
式 | 一致しますか? | 理由 |
ANY {1, 2, 3} > ALL {1, 2} | true | 左側の値(3)が右側の値(1 と 2 の両方)よりも大きい |
ANY {1, 2, 3} == NONE {1, 2} | true | 3 は 1 または 2 のいずれにも一致しません |
ANY {4, 8} == ANY {5, 9, 11} | false | 4 でも 8 も右側の値のいずれにも一致しません(5、9、11) |
ANY {1, 2, 7} <= NONE {1, 2} | true | 左の値(7)は 1 と 2 の両方が 以下ではありません |
ALL {1, 2} IN ANY {1, 2, 3} | true | 左側のすべての値(1 と 2)は 1、2、または 3 に等しい |
ALL {3, 1, 4, 3} == NONE {1, 2} | false | 1 は None リスト内の値(1 または 2)と一致します |
ALL {} in ALL {1, 2} | true | 空のリストはすべてのリストと一致します |
NONE {1, 2, 3, 12} > ALL {5, 9, 11} | false | 12 は右側のすべての値(5、9、11)よりも大きいです |
NONE {4, 8} > ALL {5, 9, 11} | true | 4 と 8 は両方とも右側の値(5、9、または 11)より小さい |
NONE {0, 1} < NONE {1, 2} | true | 0 と 1 はどちらも 1 と 2 のいずれがない場合よりも小さいです |
全文検索
RQL を使用して、全文検索(FTS)注釈を持つプロパティをクエリできます。 FTS は関連性の検索ではなく、ブール値一致の単語検索をサポートしています。 プロパティで FTS を有効にする方法の詳細については、SDK の FTS ドキュメントを参照してください。
Swift SDK はまだ全文検索をサポートしていません。
これらのプロパティをクエリするには、クエリでTEXT
述語を使用します。
単語またはフレーズ全体を検索したり、次の文字で結果を制限したりすることもできます。
単語の前に
-
文字を付けて、単語の結果を除外します。プレフィックスの末尾に
*
文字を配置してプレフィックスを指定します。 サフィックス検索は現在サポートされていません。
次の例では、 Item.name
プロパティをクエリします。
// Filter for items with 'write' in the name "name TEXT $0", "write" // Find items with 'write' but not 'tests' using '-' "name TEXT $0", "write -tests" // Find items starting with 'wri-' using '*' "name TEXT $0", "wri*"
全文検索トークナイザの詳細
全文検索(FTS)インデックスは以下をサポートします。
トークンは、発音区別符号を区別せず、大文字と小文字を区別しません。
トークンは、ASCII と Atlas 1 の追加文字(西部言語)のみで構成できます。 他のすべての文字は空白と見なされます。
ハイフン(-)で区切られた単語は 2 つのトークンに分割されます。 たとえば、
full-text
はfull
とtext
に分割されます。
地理空間クエリ
geoWithin
演算子を使用して、地理空間データに対してクエリを実行できます。 geoWithin
演算子は、カスタム埋め込みオブジェクトのcoordinates
プロパティと地理空間形状の緯度と経度のペアを受け取ります。 演算子は、 cordinates
点が地理空間形状内に含まれているかどうかを確認します。
次の地理空間の形状はクエリでサポートされています。
GeoCircle
GeoBox
GeoPolygon
地理空間データをクエリするには、次のようにします。
埋め込み地理空間データを含む プロパティを持つオブジェクトを作成します。
地理空間の形状を定義して、クエリの境界を設定します。
geoWithin
RQL 演算子を使用してクエリを実行します。
次のクエリでは、埋め込みlocation
プロパティの座標がGeoCircle
の形状、 smallCircle
内に含まれていることを確認しています。
"location geoWithin $0", smallCircle
地理空間シェイプと地理空間データが埋め込まれたオブジェクトの定義の詳細については、SDK の地理空間ドキュメントを参照してください。
バックリンク クエリ
バックリンクは、別のオブジェクトを参照するオブジェクトを検索できる逆関係リンクです。 バックリンクは、オブジェクト スキーマで定義されている 1 対多の関係を使用しますが、方向は逆です。 スキーマで定義するすべての関係には、対応するバックリンクが暗黙的にあります。
@links.<ObjectType>.<PropertyName>
構文を使用してクエリでバックリンクにアクセスできます。 <ObjectType>
と<PropertyName>
は、クエリされたオブジェクトタイプを参照するオブジェクトタイプ上の特定のプロパティを参照します。
// Find items that belong to a project with a quota greater than 10 (@links) "@links.Project.items.quota > 10"
また、 linkingObjects
プロパティを定義して、データモデルにバックリンクを明示的に含めることもできます。 こうすると、標準のドット表記を使用して、割り当てられたプロパティ名を介してバックリンクを参照できるようになります。
// Find items that belong to a project with a quota greater than 10 (LinkingObjects) "projects.quota > 10"
バックリンクの結果はコレクションのように扱われ、コレクション演算子をサポートします。
// Find items where any project that references the item has a quota greater than 0 "ANY @links.Project.items.quota > 0" // Find items where all projects that reference the item have a quota greater than 0 "ALL @links.Project.items.quota > 0"
バックリンク コレクションでは集計演算子を使用できます。
// Find items that are referenced by multiple projects "projects.@count > 1" // Find items that are not referenced by any project "@links.Project.items.@count == 0" // Find items that belong to a project where the average item has // been worked on for at least 5 minutes "@links.Project.items.items.@avg.progressMinutes > 10"
オブジェクトを指しているすべての関係の数をクエリするには、 @count
演算子を@links
で直接使用します。
// Find items that are not referenced by another object of any type "@links.@count == 0"
サブクエリ
SUBQUERY()
述語関数を使用して、別のクエリでリスト プロパティを反復処理します。
サブクエリは、次のシナリオで役立ちます。
複数の条件でのリスト プロパティ内の各オブジェクトの一致
サブクエリに一致するオブジェクト数のカウント
SUBQUERY()
の構造は次のとおりです。
SUBQUERY(<collection>, <variableName>, <predicate>)
collection
: 反復処理するプロパティの名前variableName
: サブクエリで使用する要素の変数名predicate
: サブクエリ述語。 現在反復処理されている要素を参照するには、variableName
で指定された変数を使用します。
サブクエリは指定されたコレクションを反復処理し、指定された述語をコレクション内の各オブジェクトと照合します。 述語は、 SUBQUERY()
に渡された変数名を持つ現在の反復オブジェクトを参照できます。
サブクエリ式は、オブジェクトのリストに変換されます。 Realm では、サブクエリの結果に対してのみ@count
集計演算子をサポートします。 これにより、述語に一致したサブクエリ入力コレクション内のオブジェクトの数をカウントできます。
サブクエリ結果のカウントは、有効な 式 内の他の数値と同様に使用できます。 特に、カウントと数値0
を比較すると、一致するすべてのオブジェクトを返すことができます。
例
次の例では、プロジェクトのコレクションに対する 2 つのサブクエリ フィルターを示しています。
// Returns projects with items that have not been completed // by a user named Alex. "SUBQUERY(items, $item, $item.isComplete == false AND $item.assignee == 'Alex').@count > 0" // Returns the projects where the number of completed items is // greater than or equal to the value of a project's `quota` property. "SUBQUERY(items, $item, $item.isComplete == true).@count >= quota"
ソート、個別、制限
追加の演算子を使用して、クエリの結果コレクションをソートして制限します。
演算子 | 説明 |
---|---|
SORT | 比較するプロパティの名前と、昇順( たとえば、 |
DISTINCT | 比較するプロパティの名前を指定します。 結果コレクション内のそのプロパティの重複を削除します。 複数の DIS値 を指定すると、クエリは最初のフィールドで重複を削除し、その後 2 番目のフィールドで重複を削除します。 たとえば、 DISTINCT (name, assignee) の場合、クエリは両方のプロパティの値が同じである重複のみを削除します。 |
LIMIT | 結果のコレクションを指定された数に制限します。 |
例
クエリ エンジンのソート、個別、制限演算子を使用して、割り当て対象が エイリアスである ToDo 項目を検索します。
優先順位の降順でソート
名前による一意性の強制
結果を 5 つの項目に制限します
"assignee == 'Ali' SORT(priority DESC) DISTINCT(name) LIMIT(5)"
Flexible Sync RQL の制限
インデックス付きクエリ可能なフィールドのサブスクリプション要件
インデックス付きのクエリ可能なフィールドをアプリに追加すると、厳密にパーティション化されたデータに対する単純なクエリのパフォーマンスが向上します。 たとえば、クエリがデバイス、ストア、またはユーザーにデータを厳密にマッピングするアプリuser_id == $0, “641374b03725038381d2e1fb”
など)は、インデックス付きクエリ可能なフィールドの候補となります。 ただし、インデックス付きのクエリ可能なフィールドには、クエリ サブスクリプションで使用するための特定の要件があります。
インデックス付きクエリ可能なフィールドは、すべてのサブスクライブ クエリで使用する必要があります。 クエリから欠落することはできません。
インデックス付きクエリ可能なフィールドは、サブスクライブ クエリで少なくとも 1 回、定数に対して
==
またはIN
の比較を使用する必要があります。 たとえば、user_id == $0, "641374b03725038381d2e1fb"
やstore_id IN $0, {1,2,3}
などです。
オプションとして、インデックス付きクエリ可能なフィールドが==
またはIN
を少なくとも 1 回使用して定数と直接比較される限り、 AND
比較を含めることができます。 たとえば、 store_id IN {1,2,3} AND region=="Northeast"
やstore_id == 1 AND (active_promotions < 5 OR num_employees < 10)
などです。
インデックス付きクエリ可能なフィールドに対する無効なFlexible Sync クエリには、次のクエリが含まれます。
インデックス付きクエリ可能なフィールドは、クエリの残りの部分で
AND
を使用しません。store_id IN {1,2,3} OR region=="Northeast"
OR
たとえば、AND
は ではなく を使用しているため無効です。同様に、store_id == 1 AND active_promotions < 5 OR num_employees < 10
は無効です。AND
はクエリ全体ではなく、その横にあるタームにのみ適用されるためです。インデックス付きクエリ可能なフィールドは 等価演算子 では使用されません。 たとえば、
store_id > 2 AND region=="Northeast"
は無効です。インデックス付きクエリ可能なフィールドでは>
演算子のみが使用され、等価比較がないためです。クエリに、インデックス付きのクエリ可能なフィールドが完全にありません。 たとえば、
region=="Northeast
またはtruepredicate
は、インデックス付きクエリ可能なフィールドが含まれていないため無効です。
Flexible Sync でサポートされていないクエリ演算子
RQL 演算子を使用する場合、Flexible Sync にはいくつかの制限があります。 同期するデータを決定するクエリ サブスクリプションを書込む場合、サーバーはこれらのクエリ演算子をサポートしていません。 ただし、RQL 機能の全範囲を使用して、クライアント アプリケーション内の同期されたデータセットをクエリすることはできます。
演算子タイプ | サポートされていない演算子 |
---|---|
集計演算子 | @avg , @count , @max , @min , @sum |
クエリサフィックス | DISTINCT , SORT , LIMIT |
大文字と小文字を区別しないクエリ( [c]
)は、インデックスを効果的に使用できません。 その結果、大文字と小文字を区別しないクエリはパフォーマンスの問題を引き起こす可能性があるため、推奨されません。
Flexible Sync は、配列フィールドの@count
のみをサポートします。
クエリをリストする
Flexible Sync は、 IN
演算子を使用するクエリ リストをサポートしています。
定数のリストをクエリして、クエリ可能なフィールドの値が含まれているかどうかを確認できます。
// Query a constant list for a queryable field value "priority IN { 1, 2, 3 }"
クエリ可能なフィールドに配列値がある場合は、定数値が含まれているかどうかをクエリできます。
// Query an array-valued queryable field for a constant value "'comedy' IN genres"
警告
Flexible Sync クエリでは、2 つのリストを相互に比較することはできません。 RQLこれはFlexible Sync クエリの外部では有効な 構文であることに注意してください。
// Invalid Flexible Sync query. Do not do this! "{'comedy', 'horror', 'suspense'} IN genres" // Another invalid Flexible Sync query. Do not do this! "ANY {'comedy', 'horror', 'suspense'} != ANY genres"
埋め込みオブジェクトまたはリンクされたオブジェクト
Flexible Sync は、 埋め込みオブジェクトまたはリンク のプロパティに対するクエリをサポートしていません。 たとえば、 obj1.field == "foo"
。
クエリ サイズの制限
サブスクリプションセット内の特定のクエリ サブスクライブのサイズ制限は256 kBです。 この制限を超えると、 LimitsExceeded エラー が発生します。