如何在 returns 键值对中对数据排序的 Fauna DB 中创建索引
How do I create an index in Fauna DB that returns sorted data in key value pairs
我正在尝试创建一个索引,该索引 returns 使用键对 object 中的数据进行排序。
我的 collection returns 的默认索引是这样的:
{
"ref": Ref(Collection("posts"), "251333584234742292"),
"ts": 1583632773120000,
"data": {
"title": "A Great Title",
"sort_date": "2019-12-11",
"post_type": "blog",
"status": "published",
}
},...
我使用以下代码在 shell 中创建了一个索引:
CreateIndex({
name: "posts_sort_date_desc",
source: Collection("posts"),
values: [
{ field: ["data", "sort_date"], reverse: true },
{ field: ["data", "title"] },
{ field: ["data", "post_type"] },
{ field: ["data", "status"] },
{ field: ["ref"] }
]
}
当我查看这个新索引时,排序是正确的,但它看起来像一个没有键的数组数组:
[
"2019-12-11",
"A Great Title",
"",
"published",
Ref(Collection("posts"), "254000373213168147")
], ...
有没有一种方法可以仅使用我需要的键值对数据来创建排序索引?我已经查看了文档,但无法弄清楚。谢谢
对您的问题的简短回答是:“不,没有”,但您的问题可能有解决方案(我需要更好地理解您尝试解决的问题)。索引将 始终 return 数据数组,因为这就是它们的结构,FaunaDB 使您可以访问索引的原始功能。我们不会试图变得聪明并解释您可能想要的东西。
(免责声明,我没有测试代码,这里是 11:30 下午所以我几乎要注销了:)但仍然想帮助你)
也就是说,有两个选择:
- 与其基于索引中的值,不如取出 ref 并写一个 Map/Get 来获取基础文档,那个 将 作为一个目的。虽然每个 Get 也需要读取一次,因此这是一个权衡,但是当添加您不想排序但确实想要 return 的新属性时,它会更加灵活(否则您将拥有重新创建索引)。
Map(
Paginate(Match(Index('your_index_name'))),
Lambda(['sort_date', 'title', 'post_type', 'status', 'ref'], Get(Var('ref')))
)
- 保持索引不变,一旦获得这些值,您就可以轻松地在这些索引页上编写 Map(在 FQL 中)并通过 [=36= 重组结果] 一个对象。这看起来像
Map(
Paginate(Match(Index('your_index_name'))),
Lambda(['sort_date', 'title', 'post_type', 'status', 'ref'],
{
ref: Var('ref'),
sort_date: Var('sort_date'),
title: Var('title'),
post_type: Var('post_type'),
status: Var('status')
}
)
)
那应该给你一个对象数组:)
我正在尝试创建一个索引,该索引 returns 使用键对 object 中的数据进行排序。 我的 collection returns 的默认索引是这样的:
{
"ref": Ref(Collection("posts"), "251333584234742292"),
"ts": 1583632773120000,
"data": {
"title": "A Great Title",
"sort_date": "2019-12-11",
"post_type": "blog",
"status": "published",
}
},...
我使用以下代码在 shell 中创建了一个索引:
CreateIndex({
name: "posts_sort_date_desc",
source: Collection("posts"),
values: [
{ field: ["data", "sort_date"], reverse: true },
{ field: ["data", "title"] },
{ field: ["data", "post_type"] },
{ field: ["data", "status"] },
{ field: ["ref"] }
]
}
当我查看这个新索引时,排序是正确的,但它看起来像一个没有键的数组数组:
[
"2019-12-11",
"A Great Title",
"",
"published",
Ref(Collection("posts"), "254000373213168147")
], ...
有没有一种方法可以仅使用我需要的键值对数据来创建排序索引?我已经查看了文档,但无法弄清楚。谢谢
对您的问题的简短回答是:“不,没有”,但您的问题可能有解决方案(我需要更好地理解您尝试解决的问题)。索引将 始终 return 数据数组,因为这就是它们的结构,FaunaDB 使您可以访问索引的原始功能。我们不会试图变得聪明并解释您可能想要的东西。
(免责声明,我没有测试代码,这里是 11:30 下午所以我几乎要注销了:)但仍然想帮助你)
也就是说,有两个选择:
- 与其基于索引中的值,不如取出 ref 并写一个 Map/Get 来获取基础文档,那个 将 作为一个目的。虽然每个 Get 也需要读取一次,因此这是一个权衡,但是当添加您不想排序但确实想要 return 的新属性时,它会更加灵活(否则您将拥有重新创建索引)。
Map(
Paginate(Match(Index('your_index_name'))),
Lambda(['sort_date', 'title', 'post_type', 'status', 'ref'], Get(Var('ref')))
)
- 保持索引不变,一旦获得这些值,您就可以轻松地在这些索引页上编写 Map(在 FQL 中)并通过 [=36= 重组结果] 一个对象。这看起来像
Map(
Paginate(Match(Index('your_index_name'))),
Lambda(['sort_date', 'title', 'post_type', 'status', 'ref'],
{
ref: Var('ref'),
sort_date: Var('sort_date'),
title: Var('title'),
post_type: Var('post_type'),
status: Var('status')
}
)
)
那应该给你一个对象数组:)