【问题标题】:FaunaDB search document and get its ranking based on a scoreFaunaDB 搜索文档并根据分数获得其排名
【发布时间】:2021-04-28 09:46:28
【问题描述】:

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

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 并在集合中吐出它的 rankrank 仅按 count 字段排序。例如,假设我有以下文档(为简单起见,我忽略了其他字段):

user_id count
abc 12
xyz 10
fgh 999

如果我输入 fgh 作为这个 lambda 函数的输入,我希望它输出 1(如果从 0 开始计数,则输出 0)。

我已经有一个user_id 的索引,所以我可以从这个索引中查询和匹配一个文档引用。我还有一个索引sorted_count,它根据count 字段升序对文档进行排序。

我目前的解决方案是通过sorted_count 索引查询所有文档,然后通过遍历数组来获得排名。我认为应该有更好的解决方案。我只是没看到。

请帮忙。谢谢!

【问题讨论】:

    标签: go faunadb


    【解决方案1】:

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

    假设你有:

    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. 使用user_id 上的索引确定相关用户的count
    2. 如上所述,使用用户的count 查询sorted_count

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2020-06-21
      • 2022-12-09
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多