如何在FaunaDB中通过name字段关联users与jobs集合并合并数据
在FaunaDB中通过name关联users和jobs集合并获取合并对象
要基于name字段关联users和jobs集合,返回包含name、job、location的合并结果,可通过以下FQL查询实现:
前置准备:创建必要索引
首先需要创建两个索引,用于通过name字段快速查询两个集合的文档:
创建users集合的name索引
CreateIndex({ name: "users_by_name", source: Collection("users"), terms: [{ field: ["data", "name"] }] })
创建jobs集合的name索引
CreateIndex({ name: "jobs_by_name", source: Collection("jobs"), terms: [{ field: ["data", "name"] }] })
查询单个用户的合并数据
如果需要查询特定name的用户及其关联职位,使用以下查询:
Let( { targetName: "srinivas", // 获取匹配name的用户文档 userData: Get(Match(Index("users_by_name"), Var("targetName"))), // 获取匹配name的职位文档 jobData: Get(Match(Index("jobs_by_name"), Var("targetName"))) }, // 构造合并后的结果对象 { name: Var("targetName"), location: Select(["data", "location"], Var("userData")), job: Select(["data", "Job"], Var("jobData")) } )
查询所有用户的合并数据
如果需要批量关联所有用户与对应的职位,使用以下查询:
Let( { // 分页获取users集合的所有文档引用 userRefs: Paginate(Documents(Collection("users"))), // 遍历每个用户引用,关联职位并构造结果 mergedData: Map( Var("userRefs"), Lambda( "userRef", Let( { userDoc: Get(Var("userRef")), userName: Select(["data", "name"], Var("userDoc")), jobDoc: Get(Match(Index("jobs_by_name"), Var("userName"))) }, { name: Var("userName"), location: Select(["data", "location"], Var("userDoc")), job: Select(["data", "Job"], Var("jobDoc")) } ) ) ) }, Var("mergedData") )
注意事项
- 若
name字段在集合中不唯一,Get方法会抛出错误,此时需将Get替换为Paginate来处理多个匹配结果。 - 索引创建仅需执行一次,后续查询可直接复用。
内容的提问来源于stack exchange,提问作者Srinivas Reddy
相关产品推荐
相关产品推荐

