【问题标题】:FaunaDB: Query for all documents not referenced by another collectionFaunaDB:查询其他集合未引用的所有文档
【发布时间】:2021-12-03 11:28:30
【问题描述】:

我正在开发一个应用程序,用户可以在该应用程序中了解一种语言的不同语法模式。共有三个系列; userspatterns 通过 progress 相互关联,如下所示:

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

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

【问题讨论】:

    标签: faunadb


    【解决方案1】:

    一个明确的假设 - progress 文档是在用户以特定模式开始时创建的,这意味着用户有一些进度。例如,如果有十个模式并且一个用户已经启动了两个,那么在progress 中将有该用户的两个文档。

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

    基本做法是:

    1. 获取所有可用模式。
    2. 获取用户处理过的模式。
    3. 在两组之间选择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。选择两组之间的差异

    FQL 函数Difference 具有以下签名:

    Difference( source, diff, ... )
    

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

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

    从文档中,Difference 的返回值为:

    当 source 是 Set Reference 时,是 source 中 diff 中缺少的项目的 Set Reference。

    这意味着您需要通过Paginate 处理差异来获取参考资料本身。

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

    从那里,您可以对引用做您需要做的事情。例如,检索每个返回模式的所有数据:

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

    综合解决方案

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

    【讨论】:

    • 啊哈,谢谢!我已经想出使用Difference,但我缺少的关键是源+术语+值的组合来使patterns_by_user索引。这非常有用。
    猜你喜欢
    • 2018-06-10
    • 2021-02-03
    • 2020-08-12
    • 2015-08-20
    • 2021-02-16
    • 2018-05-09
    • 2018-07-20
    • 2021-01-12
    • 2021-09-17
    相关资源
    最近更新 更多