go - FaunaDB 搜索文档并根据分数获得其排名
问题描述
我有以下结构的文档集合:
type Streak struct {
UserID string `fauna:"user_id"`
Username string `fauna:"username"`
Count int `fauna:"count"`
UpdatedAt time.Time `fauna:"updated_at"`
CreatedAt time.Time `fauna:"created_at"`
}
这在 FaunaDB 集合中如下所示:
{
"ref": Ref(Collection("streaks"), "288597420809388544"),
"ts": 1611486798180000,
"data": {
"count": 1,
"updated_at": Time("2021-01-24T11:13:17.859483176Z"),
"user_id": "276989300",
"username": "yodanparry"
}
}
基本上我需要一个 lambda 或一个函数来接收 a并在集合中user_id
吐出它的排名。rank只是按count
字段排序。例如,假设我有以下文档(为简单起见,我忽略了其他字段):
用户身份 | 数数 |
---|---|
美国广播公司 | 12 |
xyz | 10 |
fgh | 999 |
如果我fgh
作为这个 lambda 函数的输入,我希望它吐出 1(或者如果你从 0 开始计数,则为 0)。
我已经有一个索引,user_id
所以我可以从这个索引中查询和匹配一个文档引用。我还有一个索引sorted_count
,可以根据count
字段升序对文档进行排序。
我目前的解决方案是按sorted_count
索引查询所有文档,然后通过遍历数组来获得排名。我认为应该有更好的解决方案。我只是没看到。
请帮忙。谢谢!
解决方案
计算动物群中的东西并不像人们想象的那么容易。但是您仍然可以做一些比您描述的更有效的事情。
假设你有:
CreateIndex(
{
name: "sorted_count",
source: Collection("streaks"),
values: [
{ field: ["data", "count"] }
]
}
)
然后你可以像这样查询这个索引:
Count(
Paginate(
Match(Index("sorted_count")),
{ after: 10, size: 100000 }
)
)
这将返回一个像这样的对象:
{
before: [10],
data: [123]
}
这告诉您有 123 个文档count
>= 10,我认为这就是您想要的。
这意味着,为了获得基于用户的排名user_id
,您需要实施以下两步过程:
count
使用您在 上的索引确定相关用户的身份user_id
。- 如上所述
sorted_count
使用用户的查询。count
请注意,如果您的集合有超过 100,000 个文档,您将需要您的 Go 代码根据返回的对象的after
字段遍历所有页面。100,000 是 Fauna 允许的最大页面大小。有关详细信息,请参阅有关分页的 Fauna 文档。
另请注意,这可能无法反映您解决关系所需的逻辑。