R2D1 / ドキュメント
クエリ
R2D1 はまず derived index を query し、その後 authoritative DocumentStore から matching document を hydrate します。document content を scan して application memory で filter することはありません。
Indexed field のフィルタ
where(String) で比較を開始します。field には @Index が必要で、adapter は指定された value type をサポートしなければなりません。
Page<User> page =
users.query()
.where("country")
.eq("NZ")
.sortBy("score", SortDirection.DESC)
.limit(20)
.fetch();比較演算子
すべての filter は論理 AND で結合されます。built-in JDBC contract では Boolean field は equality と inequality をサポートし、ordered comparison には ordered value type が必要です。
| Method | 意味 |
|---|---|
| eq(value) | 等しい |
| notEq(value) | 等しくない |
| gt(value) | より大きい |
| gte(value) | 以上 |
| lt(value) | より小さい |
| lte(value) | 以下 |
1つの sort
sortBy は最大1回だけ呼べます。sort field は indexed でなければならず、明示的な limit は正数にします。
Page<User> page = users.query()
.where("country").eq("NZ")
.sortBy("score", SortDirection.DESC)
.limit(20)
.fetch();Cursor pagination
fetch() は Page<T> を返し、次ページがあるとき nextCursor は non-null です。after(...) を使うときは同じ filter と sort を維持します。cursor は adapter-specific opaque token なので decode や変更をしないでください。
Page<User> first = users.query()
.sortBy("score", SortDirection.DESC)
.limit(20)
.fetch();
if (first.nextCursor() != null) {
Page<User> next = users.query()
.sortBy("score", SortDirection.DESC)
.limit(20)
.after(first.nextCursor())
.fetch();
}意図した制限
- 提供しない機能: join、aggregation、arbitrary SQL、OR predicate、全文検索、LIKE、contains、正規表現。
- query に参加する field は document metadata で @Index として宣言します。
- adapter が対応しない type や unindexed field は検証で拒否されます。
