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

FaunaDB get entries by date range with index binding not working

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

我有一个名为 orders 的集合:

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")]
}

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

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

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

这里有一些错误,首先,你必须这样创建文件:

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"),
       Ref(Collection("orders"), "278532030954734085") ],
     [ Date("2020-07-11"),
       Ref(Collection("orders"), "278532033804763655") ],
     [ Date("2020-07-12"),
       Ref(Collection("orders"), "278532036737630725") ] ] }

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

Map(Paginate(Range(Match('orders_by_my_date'),[Date("2020-07-09")], [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") } },
     { ref: Ref(Collection("orders"), "278532036737630725"),
       ts: 1601887699800000,
       data: { mydate: Date("2020-07-12") } } ] }

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"),
      Ref(Collection("orders"), "278586213229658624")
    ],
    [
      Date("2020-07-13"),
      Ref(Collection("orders"), "278586215000703488")
    ],
    [
      Date("2020-07-14"),
      Ref(Collection("orders"), "278586216887091712")
    ],
    [
      Date("2020-07-15"),
      Ref(Collection("orders"), "278586218585784832")
    ]
  ]
}

另一种方法是使用带有 lambda 表达式的过滤器来验证您想要的值

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

您可以根据需要更新条件

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