微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FaunaDB按日期范围获取条目,但索引绑定不起作用

如何解决FaunaDB按日期范围获取条目,但索引绑定不起作用

我正在努力按日期获取索引以与Range一起使用。

我有这个称为订单的集合:

CreateCollection({name: "orders"})

我有这些示例条目,其中一个属性称为mydate。如您所见,它只是一个字符串。 我确实需要将日期创建为字符串,因为在我的数据库中,我们已经有大约12K条记录,其中的日期是这样的,所以我不能仅仅开始使用Date()来创建它们。 >

Create(Collection("orders"),{data: {"mydate": "2020-07-10"}})
Create(Collection("orders"),{data: {"mydate": "2020-07-11"}})
Create(Collection("orders"),{data: {"mydate": "2020-07-12"}})

我创建了这个索引,用于计算日期和实际的Date对象

CreateIndex({
  name: "orders_by_my_date",source: [
    {
      collection: Collection("orders"),fields: {
        date: Query(Lambda("order",Date(Select(["data","mydate"],Var("order"))))),},],terms: [
    {
      binding: "date",});

如果我尝试获取单个日期,索引将起作用。

// this works
Paginate(
  Match(Index("orders_by_my_date"),Date("2020-07-10"))
);
// ---
{
  data: [Ref(Collection("orders"),"278496072502870530")]
}

但是当我尝试获取Range时,它永远找不到数据。

// This does NOT work :(
Paginate(
  Range(Match(Index("orders_by_my_date")),Date("2020-07-09"),Date("2020-07-15"))
);
// ---
{
  data: []
}

为什么索引不适用于范围?

解决方法

Range对索引的values进行操作,而不对terms进行操作。

请参阅:https://docs.fauna.com/fauna/current/api/fql/functions/range?lang=javascript

您需要将索引定义更改为:

CreateIndex({
  name: "orders_by_my_date",source: [
    {
      collection: Collection("orders"),fields: {
        date: Query(Lambda("order",Date(Select(["data","mydate"],Var("order"))))),},],values: [
    { binding: "date" },{ field: ["ref"] },})

然后,您可以获得所需的结果:

> Paginate(Range(Match(Index('orders')),Date('2020-07-11'),Date('2020-07-15')))
{
  data: [
    [
      Date("2020-07-11"),Ref(Collection("orders"),"278586211497411072")
    ],[
      Date("2020-07-12"),"278586213229658624")
    ],[
      Date("2020-07-13"),"278586215000703488")
    ],[
      Date("2020-07-14"),"278586216887091712")
    ],[
      Date("2020-07-15"),"278586218585784832")
    ]
  ]
}
,

这里有一些错误,首先,您必须以这种方式创建文档:

Create(Collection("orders"),{data: {"mydate": ToDate("2020-07-10")}})

索引必须像这样创建:

CreateIndex(
    {
     name: "orders_by_my_date",source: Collection("orders"),values:[{field:['data','mydate']},{field:['ref']}]
    }
)

最后,您可以查询索引和范围:

Paginate(Range(Match('orders_by_my_date'),[Date("2020-07-09")],[Date("2020-07-15")]))
{ data:
   [ [ Date("2020-07-10"),"278532030954734085") ],[ Date("2020-07-11"),"278532033804763655") ],[ Date("2020-07-12"),"278532036737630725") ] ] }

或者如果您想获取完整的文档:

Map(Paginate(Range(Match('orders_by_my_date'),[Date("2020-07-15")])),Lambda(['date','ref'],Get(Var('ref'))))
{ data:
   [ { ref: Ref(Collection("orders"),"278532030954734085"),ts: 1601887694290000,data: { mydate: Date("2020-07-10") } },{ ref: Ref(Collection("orders"),"278532033804763655"),ts: 1601887697015000,data: { mydate: Date("2020-07-11") } },"278532036737630725"),ts: 1601887699800000,data: { mydate: Date("2020-07-12") } } ] }
,

另一种选择是使用带有lambda表达式的过滤器来验证所需的值

Filter(
  Paginate(Documents(Collection('orders'))),Lambda('order',And(
      GTE(Select(['data','mydate'],Var('order')),'2020-07-09'),LTE(Select(['data','2020-07-15')
      )
    )
  )

您可以根据需要更新条件

我相信这将适用于您已经拥有的字符串

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。