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

FaunaDB search document and get its ranking based on a score

我有以下具有结构的文档集合:

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 的函数。 rank 只是按 count 字段排序。例如,假设我有以下文档(为简单起见,我忽略了其他字段):

user_id count
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 }
  )
)

哪个会 return 一个像这样的 object:

{
  before: [10],
  data: [123]
}

这告诉你有 123 个文档 count >= 10,我认为这就是你想要的。

这意味着,为了根据 user_id 获得用户的排名,您需要实施此 two-step 过程:

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

请注意,如果您的 collection 有超过 100,000 个文档,您将需要您的 Go 代码根据 returned object' s after 字段。 100,000 是 Fauna 允许的最大页面大小。有关详细信息,请参阅 the Fauna docs on pagination

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