打开文档导航
R2D1 / 文档

查询

R2D1 先查询 derived index,再从 authoritative DocumentStore hydrate matching document。它不会扫描 document content 并在 application memory 中过滤。

过滤 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)小于等于

单个 sort

sortBy 最多调用一次。sort field 必须被索引,显式 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,不要解析、修改或当作通用查询 token 持久化。

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 会在验证时拒绝。