如何在Fauna DB中创建索引,该索引返回键值对中的排序数据

时间:2020-06-26 21:17:42

标签: faunadb

我正在尝试创建一个索引,该索引返回带有键的对象中的排序数据。 我的收藏集的默认索引返回如下内容:

{
  "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")
], ...

是否有一种方法可以仅使用键值对中需要的数据来创建排序索引?我浏览了所有文档,但无法弄清楚。谢谢。

1 个答案:

答案 0 :(得分:1)

对该问题的简短回答是:“没有就没有”,但是可能有解决您的问题的方法(我需要更好地理解您尝试解决的问题)。索引将始终返回数据数组,因为这是它们的结构方式,FaunaDB使您可以访问索引的原始功能。我们不会试图变得聪明并解释您可能想要的东西。

(免责声明,我没有测试代码,这里是晚上11:30,所以我几乎要注销了:),但仍然想为您提供帮助)

也就是说,有两种选择:

  • 取而代之的是,不要引用索引中的值,而是提取引用并编写Map / Get以获得基础文档,以使作为对象。尽管每个Get都需要读取,所以这是一个折衷方案,但是当添加了您不想对其进行排序但又想返回的新属性时,它将更加灵活(否则您将不得不重新创建索引) )。
Map(
   Paginate(Match(Index('your_index_name'))),
   Lambda(['sort_date', 'title', 'post_type', 'status', 'ref'], Get(Var('ref')))
)
  • 保持索引不变,一旦获得这些值,就可以轻松地在这些索引页面上编写一个 Map (以FQL格式),并通过返回一个Object来重组结果。看起来像
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')
     }
   )
)

那应该给你一个对象数组:)