如何解决FaunaDB按日期范围获取条目,但索引绑定不起作用
我有这个称为订单的集合:
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 举报,一经查实,本站将立刻删除。