AQL:具有嵌套数组日期的动态查询

时间:2018-05-14 09:00:31

标签: arangodb aql arangojs

我一直在尝试使用这个动态查询来处理日期,如下面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
    } 
} 

需要一些帮助才能超越这个

1 个答案:

答案 0 :(得分:1)

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

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

  • 您可能认为比较运算符>=对数组不起作用。 nulltruefalse以及每个数字字符串都少于任何数组,请参阅Type and Value Order。您的时间戳数组将始终大于任何给定时间戳字符串。您可能需要的是array comparison operator,例如ALL >=

  • 表达式dates[*].startsAt不能用作绑定参数。如果文档结构没有像{ "date": { "startsAt": "..." } }这样的数组,那么将["date", "startsAt"]绑定为p1p2就完全没问了。请注意bind参数值是一个字符串数组。另一方面,"date.startsAt"将描述顶级属性的路径 { "date.startsAt": ... }而不是顶级属性日期的嵌套属性startsAt,如{ "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

bindVars:

{
  "@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
}