如何按创建的时间戳搜索和排序动物群

时间:2020-08-29 03:38:22

标签: faunadb

我想从测验中检索结果并首先返回最新的测验,我看到有一个ts-时间戳字段,用于记录创建的时间。请在下面查看我的查询。

await client.query(
    q.Map(
        q.Paginate(
    q.Match(q.Index("all_school_queries")),

            {size:1000}
        ),
        q.Lambda(
            "school_query",
            q.Get(q.Var("school_query"))
        )
    )
)

1 个答案:

答案 0 :(得分:0)

您当前的查询使用一个'all_school_queries'索引,我假设它只是返回引用。这意味着它将在值中包含 ref ,或者根本不包含任何值(因为ref将是默认返回值)。因此,当前您的索引可能看起来像这样:

CreateIndex( { 名称:“ all_school_queries”, 资料来源:Collection('') } ) 要对该索引进行排序,我们需要添加值(当前按引用排序)。因此,要获得(几乎)等效的索引,我们可以编写此代码。

CreateIndex({
      name: "all_school_queries",
      source: Collection('<yourcollection>'),
      values:   values: [
         {
           field: ["ref"]
         }
      ]
    })

值决定:

  • 索引将返回什么
  • 该索引将以什么顺序返回这些值(再次通过ref此处)
  • 我们可以在该索引上编写哪些范围查询,在上述情况下,我们可以在ref上编写范围查询(当然这是没有用的)。

但是我们可以添加任意多个值,因此请确保可以按ts排序

CreateIndex({
  name: "all_school_queries",
  source: Collection('<yourcollection>'),
  values:   values: [
     {
       field: ["ts"]
     },
     {
       field: ["ref"]
     }
  ]
})

这为您买了两件事。现在,您的索引将按ts(然后按ref)排序,并且您也可以在时间戳上编写范围查询。它还会更改索引返回的内容,现在将返回ts和ref。现在,您可以选择添加所需的所有数据(如果数据更改,灵活性会降低),或者将ref作为额外参数返回,并像已经做的那样使用Map / Get来获取实际对象。您只需要稍微重写一下查询即可:

await client.query(
    q.Map(
        q.Paginate(
    q.Match(q.Index("all_school_queries_by_ts")),

            {size:1000}
        ),
        q.Lambda(
            ["ts", "ref"],       // we now have two parameters
            q.Get(q.Var("ref"))  // and only use the ref, but the result will be automatically sorted by ts
        )
    )
)

仅供参考,如果您更喜欢使用UI创建索引,则外观如下:

enter image description here