如何在FaunaDB中为@relation关联的文档字段值创建索引?
问题解答
你可以在FaunaDB中为@relation关联的字段值实现查询索引,但无法直接在主集合上通过跨集合的字段路径(比如data.testing.status)创建索引,创建失败和枚举类型无关。
失败原因说明
FaunaDB的索引只能基于单个集合内文档自身存储的字段值构建,无法自动遍历关联Ref对应的文档字段生成索引条目。你定义的TestType集合中testing字段仅存储关联Testing文档的Ref,本身不存在data.testing.status这个路径的存储值,因此直接指定该路径创建索引会失败。
枚举类型不会导致索引创建失败:FaunaDB中枚举值底层以字符串形式存储,完全支持作为索引的terms字段。
可行解决方案
方案1:通过关联集合索引+反向关联查询实现(无需冗余存储)
@relation修饰的双向关联会自动生成反向查询索引,你可以先查关联集合的目标字段,再通过反向索引拿到主集合的关联数据,以你给出的Schema为例操作如下:
- 给Testing集合的status字段创建索引:
CreateIndex({ name: "testing_by_status", source: Collection("Testing"), terms: [{ field: ["data", "status"] }] })
- 查询时先匹配对应状态的Testing文档,再调用Fauna自动生成的反向关联索引(命名规则为
{小写子类型名}_{小写关联字段名}_by_{小写对端字段名},你可以在控制台索引列表确认具体名称,示例为testing_testTypes_by_testing)拿到所有关联的TestType文档:
Map( Paginate(Match(Index("testing_by_status"), "UNPAID")), Lambda("testingRef", Paginate(Match(Index("testing_testTypes_by_testing"), Var("testingRef"))) ) )
对应你后续贴的Certificate、Remittance场景,只需要先给Remittance集合的status建索引,再通过自动生成的反向关联索引查关联的Certificate即可,和上述逻辑完全一致。
方案2:冗余存储关联字段值(适合读多写少场景)
如果需要直接从主集合维度查询,可以在主集合中冗余存储关联字段的值,每次更新关联文档的对应字段时同步更新主集合的冗余字段,之后直接给冗余字段创建索引即可:
// 给TestType添加冗余字段后的索引创建示例 CreateIndex({ name: "testType_by_testing_status", source: Collection("TestType"), terms: [{ field: ["data", "testingStatus"] }] })
查询时直接匹配该索引即可拿到结果,查询性能更高。
内容的提问来源于stack exchange,提问作者floydianslips
相关产品推荐
相关产品推荐

