查询构建器
DocStore 和 SegmentedLog 提供 query()。DocStore 可以使用二级索引;SegmentedLog 则对流式读取的记录应用相同谓词。
PHP
$records = $docs
->query()
->where('kind')->eq('page')
->where('status')->in(['draft', 'published'])
->where('publishedAt')->between($from, $until)
->orderBy('publishedAt', 'desc')
->limit(50)
->get();
常用终结方法:
PHP
$docs->query()->where('slug')->eq('home')->first();
$docs->query()->where('kind')->eq('page')->count();
$docs->query()->cursor($lastId)->page(100)->get();
$docs->query()->where('slug')->eq('home')->explain();
在 DocStore 上,针对非唯一相等索引字段的两个 eq 条件可以使用自动复合分桶。单字段相等、in 和范围运算符仍会使用已配置的字段索引。
运算符:
eq,neqin,notIngt,gte,lt,lte,betweenexists,missingprefixandWhere,orWhereorderBy,limit,cursor,page
andWhere 和 orWhere 使用回调,因为 and 和 or 是保留的 PHP 关键字:
PHP
$docs->query()
->where('kind')->eq('page')
->orWhere(fn ($q) => $q->where('kind')->eq('post')->where('featured')->eq(true))
->get();
链式调用 where() 会以 AND 组合;每个 orWhere() 分支都会添加一个备选条件。
执行方式说明
每个条件都适用于任何集合;索引只会改变执行开销。在 DocStore 上,eq 和 in 通过相等索引解析,范围运算符和 prefix 通过范围索引解析;在范围索引字段上使用 orderBy 和 limit 时,会按索引顺序读取。其他情况都会扫描记录并筛选。对于规划器无法通过索引处理的字段,orderBy 会在 PHP 中对匹配记录排序,因此在大型集合中应将其与索引条件配合使用。当筛选条件是单个相等条件时,count() 会在 DocStore 上使用索引条目计数,在 SegmentedLog 上使用内存计数器。
cursor($id) 会将结果限制为指定 ID 之后的记录,可与 page() 组合,按记录 ID 排序实现稳定分页。若要在不使用构建器时执行普通流式筛选,请参阅查询。