FaunaDB:查询其他集合未引用的所有文档

FaunaDB: Query for all documents not referenced by another collection

我正在开发一款应用程序,用户可以在其中了解一种语言的不同语法模式。共有三个系列; userspatternsprogress 相互关联,看起来像这样:

Create(Collection("progress"), {
  data: {
    userRef: Ref(Collection("users"), userId),
    patternRef: Ref(Collection("patterns"), patternId),
    initiallyLearnedAt: Now(),
    lastReviewedAt: Now(),
    srsLevel: 1
  }
})

我已经学会了如何进行一些基本的动物群查询,但现在我有一个稍微复杂一些的关系查询。我想编写一个 FQL 查询(和所需的索引)来检索 给定用户没有进度的所有模式 。也就是说,他们还没有学到的一切。我将如何编写这样的查询?

一个澄清的假设 - 当用户开始使用特定模式时会创建 progress 文档,这意味着用户有 一些 进步。例如,如果有十个模式,而一个用户启动了两个,那么在 progress.

中将有该用户的两个文档

如果该假设成立,您的问题是“我们怎样才能找到其他八个?”

基本方法是:

  1. 获取所有可用模式。
  2. 获取用户使用过的模式。
  3. Select两组之间difference

1。获取所有可用模式。

使用 FQL 中的内置 Documents 函数,这个很简单:

Documents(Collection("patterns"))

2。获取用户使用过的模式。

要获取用户使用过的所有模式,您需要在 progress 集合上创建一个索引,正如您所了解的那样。您的 字词 是您要搜索的内容,在本例中为 userRef。您的 是您想要返回的结果,在本例中为 patternRef.

这看起来像下面这样:

CreateIndex({
  name: "patterns_by_user",
  source: Collection("progress"),
  terms: [
    { field: ["data", "userRef"] }
  ],
  values: [
    { field: ["data", "patternRef"] }
  ],
  unique: true
})

然后,要获得用户拥有 一些 的所有模式的 set 进度:

Match(
  "patterns_by_user",
  Ref(Collections("users"), userId)
)

3。 Select两组之间的差异

FQL 函数 Difference 具有以下签名:

Difference( source, diff, ... )

这意味着您首先需要最大的集合,在本例中是 patterns 集合中的所有文档。

如果反转参数,您将得到一个空集,因为在用户使用的模式集中没有文档不在所有模式集中.

根据文档,Difference 的 return 值为:

When source is a Set Reference, a Set Reference of the items in source that are missing from diff.

这意味着您需要 Paginate 计算差异才能获得参考文献本身。

Paginate(
  Difference(
    Documents(Collection("patterns")),
    Match(
      "patterns_by_user",
      Ref(Collection("users"), userId)
    )
  )
)

从那里,您可以对参考文献执行您需要执行的操作。例如,要检索每个 returned 模式的所有数据:

Map(
  Paginate(
    Difference(
      Documents(Collection("patterns")),
      Match(
        "patterns_by_user",
        Ref(Collection("users"), userId)
      )
    )
  ),
  Lambda("patternRef", Get(Var("patternRef")))
)

综合解决方案

  1. 按照第二步
  2. 创建索引patterns_by_user
  3. 如第三步查询差异