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