一个明确的假设 - progress 文档是在用户以特定模式开始时创建的,这意味着用户有一些进度。例如,如果有十个模式并且一个用户已经启动了两个,那么在progress 中将有该用户的两个文档。
如果该假设成立,您的问题是“我们如何才能找到其他八个?”
基本做法是:
- 获取所有可用模式。
- 获取用户处理过的模式。
- 在两组之间选择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")))
)
综合解决方案
- 按照第二步创建索引
patterns_by_user
- 按照第三步查询差异