如何解决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 或一个函数,它接受一个 user_id
并在集合中吐出它的 rank。 排名 仅按 count
字段排序。例如,假设我有以下文档(为简单起见,我忽略了其他字段):
user_id | 计数 |
---|---|
ABC | 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 允许的最大页面大小。有关详细信息,请参阅 the Fauna docs on pagination。
另请注意,这可能无法反映您想要的解决关系的逻辑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。