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 过程:
- 使用
user_id
上的索引确定相关用户的 count
。
- 使用用户的
count
如上所述查询 sorted_count
。
请注意,如果您的 collection 有超过 100,000 个文档,您将需要您的 Go 代码根据 returned object' s after
字段。 100,000 是 Fauna 允许的最大页面大小。有关详细信息,请参阅 the Fauna docs on pagination。
另请注意,这可能无法反映您想要的解决关系的逻辑。
我有以下具有结构的文档集合:
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 过程:
- 使用
user_id
上的索引确定相关用户的count
。 - 使用用户的
count
如上所述查询sorted_count
。
请注意,如果您的 collection 有超过 100,000 个文档,您将需要您的 Go 代码根据 returned object' s after
字段。 100,000 是 Fauna 允许的最大页面大小。有关详细信息,请参阅 the Fauna docs on pagination。
另请注意,这可能无法反映您想要的解决关系的逻辑。