微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FaunaDB 搜索文档并根据分数获得其排名

如何解决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 获得用户的排名,您需要实施以下两步流程:

  1. 使用您在 count 上的索引确定相关用户的 user_id
  2. 如上所述使用用户的 sorted_count 查询 count

请注意,如果您的集合包含超过 100,000 个文档,您需要使用 Go 代码根据返回对象的 after 字段遍历所有页面。 100,000 是 Fauna 允许的最大页面大小。有关详细信息,请参阅 the Fauna docs on pagination

另请注意,这可能无法反映您想要的解决关系的逻辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。