1

我正在努力让 Index by Date 与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?

4

3 回答 3

2

Rangevalues索引进行操作,而不是对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")
    ]
  ]
}
于 2020-10-05T23:27:28.747 回答
0

另一种选择是使用带有 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')
      )
    )
  )

您可以根据需要更新条件

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

于 2020-10-10T23:44:11.667 回答
0

There are some mistakes here, first of all, you have to create documents that way:

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

The index has to be created like this:

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

and finally, you can query your index and range:

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

or if you want to get the full doc:

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") } } ] }
于 2020-10-05T08:54:21.130 回答