ドキュメントナビゲーションを開く
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 は検証で拒否されます。