FaunaDB:查询其他集合未引用的所有文档
FaunaDB: Query for all documents not referenced by another collection
我正在开发一款应用程序,用户可以在其中了解一种语言的不同语法模式。共有三个系列; users
和 patterns
由 progress
相互关联,看起来像这样:
Create(Collection("progress"), {
data: {
userRef: Ref(Collection("users"), userId),
patternRef: Ref(Collection("patterns"), patternId),
initiallyLearnedAt: Now(),
lastReviewedAt: Now(),
srsLevel: 1
}
})
我已经学会了如何进行一些基本的动物群查询,但现在我有一个稍微复杂一些的关系查询。我想编写一个 FQL 查询(和所需的索引)来检索 给定用户没有进度的所有模式 。也就是说,他们还没有学到的一切。我将如何编写这样的查询?
一个澄清的假设 - 当用户开始使用特定模式时会创建 progress
文档,这意味着用户有 一些 进步。例如,如果有十个模式,而一个用户启动了两个,那么在 progress
.
中将有该用户的两个文档
如果该假设成立,您的问题是“我们怎样才能找到其他八个?”
基本方法是:
- 获取所有可用模式。
- 获取用户使用过的模式。
- 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")))
)
综合解决方案
- 按照第二步
创建索引patterns_by_user
- 如第三步查询差异
我正在开发一款应用程序,用户可以在其中了解一种语言的不同语法模式。共有三个系列; users
和 patterns
由 progress
相互关联,看起来像这样:
Create(Collection("progress"), {
data: {
userRef: Ref(Collection("users"), userId),
patternRef: Ref(Collection("patterns"), patternId),
initiallyLearnedAt: Now(),
lastReviewedAt: Now(),
srsLevel: 1
}
})
我已经学会了如何进行一些基本的动物群查询,但现在我有一个稍微复杂一些的关系查询。我想编写一个 FQL 查询(和所需的索引)来检索 给定用户没有进度的所有模式 。也就是说,他们还没有学到的一切。我将如何编写这样的查询?
一个澄清的假设 - 当用户开始使用特定模式时会创建 progress
文档,这意味着用户有 一些 进步。例如,如果有十个模式,而一个用户启动了两个,那么在 progress
.
如果该假设成立,您的问题是“我们怎样才能找到其他八个?”
基本方法是:
- 获取所有可用模式。
- 获取用户使用过的模式。
- 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")))
)
综合解决方案
- 按照第二步 创建索引
- 如第三步查询差异
patterns_by_user