0

我一直试图让这个动态查询与日期一起工作,如下面的 ArangoDB 3.1 所示。

当我不尝试查询日期时,这非常有效,但只要我尝试使用如下日期查询,就会返回一个空列表......

{ 
    query: 
        'For c IN @@collectionName 
        FILTER  (  c.@p0 == @v0  AND  c.@p1 >= @v1  AND  c.@p2 <= @v2  )  
        LIMIT  @count  RETURN c ',

    bindVars: {
        '@collectionName': 'Event',
        p0: 'isPublished',
        v0: true,
        p1: 'dates[*].startsAt',
        v1: '2018-06-01T04:00:00.000Z',
        p2: 'dates[*].startsAt',
        v2: '2018-07-01T03:59:59.999Z',
        count: 9
    } 
} 

需要一些帮助来解决这个问题

4

1 回答 1

2

您的查询中有错误,但它们实际上与日期无关:

  • dates[*].startsAt不是有效的属性路径,而是 的简写表达式FOR date IN dates RETURN date.startsAt,它返回一个数组

  • 如您所想,比较运算符>=不适用于数组。null, true,false并且每个数字字符串都小于任何数组,请参阅类型和值顺序。您的时间戳数组将始终大于任何给定的时间戳字符串。您可能想要的是一个数组比较运算符,例如ALL >=.

  • 表达式dates[*].startsAt不能用作绑定参数。对于没有数组的文档结构{ "date": { "startsAt": "..." } },将其绑定["date", "startsAt"]p1or是完全可以的p2。请注意绑定参数值如何是一个字符串数组。"date.startsAt"另一方面,将描述顶级属性的路径,
    { "date.startsAt": ... }而不是顶级属性 date 的嵌套属性 startAt,例如{ "date": { "startsAt": ... } }.
    您所做的是描述一个不存在dates[*].startsAt的顶级属性,例如。也不起作用。如果要使用数组扩展表达式,则必须像在查询中一样编写它并使用绑定参数。
    { "dates[*].startsAt": ... }["dates[*]", "startsAt"]c.@p1a[*].@p1b{ "p1a": "dates", "p2a": "startsAt" }

询问:

FOR c IN @@collectionName 
  FILTER c.@p0 == @v0
  FILTER c.@p1a[*].@p1b ALL >= @v1 
  FILTER c.@p2a[*].@p2b ALL < @v2
  LIMIT @count
  RETURN c

绑定变量:

{
  "@collectionName": "Event",
  "p0": "isPublished",
  "v0": true,
  "p1a": "dates",
  "p1b": "startsAt",
  "v1": "2018-06-01T04:00:00.000Z",
  "p2a": "dates",
  "p2b": "startsAt",
  "v2": "2018-07-01T04:00:00.000Z",
  "count": 9
}
于 2018-05-14T13:20:58.737 回答