FaunaDB如何按日期筛选文档并保留嵌套关联用户数据
问题原因
你查询返回空的核心原因是backyard_by_date索引配置缺失:当前索引只指定了源集合,没有配置values字段将date纳入索引排序规则,Range函数无法基于未建立排序索引的字段做范围匹配,自然返回空结果。
解决方法
第一步:重建符合要求的索引
FaunaDB的范围查询依赖索引values字段定义的排序规则,你需要删除原有错误索引,执行以下语句创建正确的索引:
CreateIndex({ name: "backyard_by_date", unique: false, serialized: true, source: Collection("backyard"), values: [ { field: ["data", "date"] }, { field: ["ref"] } ] })
创建后等待索引构建完成(索引状态中serialized为true即代表构建完毕,FaunaDB索引为异步构建,刚创建后立即查询可能暂时无数据)。
说明:你当前存储的
date字段为YYYY-MM-DD格式的字符串,该格式的字符串字典序和日期先后顺序完全一致,直接用字符串做范围匹配即可,不需要额外转换类型。
第二步:调整查询语句
新索引返回的条目结构为[date值, 文档ref],不是直接返回文档ref,需要调整Lambda内的取值逻辑,修改后的查询如下:
Map( Paginate( Range( Match(Index("backyard_by_date")), "2022-05-08", "2022-06-08" ) ), Lambda( "entry", Let( { backyardRef: Select(1, Var("entry")), backyard: Get(Var("backyardRef")), user: Get(Select(["data", "user"], Var("backyard"))) }, { backyard: Var("backyard"), user: Var("user") } ) ) )
执行该查询即可在按date字段筛选backyard集合的同时,保留关联的user嵌套文档,返回结构和你最初全量查询的结构完全一致。
注意事项
Range查询默认是闭区间,以上查询会包含2022-05-08和2022-06-08两天的所有数据,如果不需要包含边界值,可自行调整传入的起止日期- 不要在索引中遗漏ref字段,否则查询时拿不到对应文档的引用,无法执行后续的Get操作获取完整文档和关联user数据
内容的提问来源于stack exchange,提问作者paolo
相关产品推荐
相关产品推荐

