首页 > 解决方案 > 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索引查询所有文档,然后通过遍历数组来获得排名。我认为应该有更好的解决方案。我只是没看到。

请帮忙。谢谢!

标签: gofaunadb

解决方案


计算动物群中的东西并不像人们想象的那么容易。但是您仍然可以做一些比您描述的更有效的事情。

假设你有:

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 允许的最大页面大小。有关详细信息,请参阅有关分页的 Fauna 文档

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


推荐阅读