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

Arangodb AQL:具有嵌套数组日期的动态查询,arangodb,aql,arangojs,Arangodb,Aql,Arangojs,我一直在尝试让这个动态查询处理日期,如Arangodb3.1所示 当我不尝试查询日期时,这非常有效,但当我尝试查询以下日期时,会返回一个空列表 { query: 'For c IN @@collectionName FILTER ( c.@p0 == @v0 AND c.@p1 >= @v1 AND c.@p2 <= @v2 ) LIMIT @count RETURN c ', bindVa

我一直在尝试让这个动态查询处理日期,如Arangodb3.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
    } 
} 
{
查询:
'对于@@collectionName中的c

过滤器(c.@p0==@v0和c.@p1>=@v1和c.@p2您的查询中存在错误,但它们实际上与日期无关:

  • dates[*].startsAt
    不是有效的属性路径,而是日期返回日期.startsAt
中日期的
的简写表达式,返回数组

  • 比较运算符
    =
    不能像您所想的那样在数组上工作。
    null
    true
    false
    以及每个数字和字符串都比任何数组小,请参见。您的时间戳数组将始终大于任何给定的时间戳字符串。您可能需要的是一个like
    ALL>=

  • 表达式
    dates[*].startsAt
    不能用作绑定参数。对于没有数组的文档结构,如
    {“date”:{“startsAt”:“…”}
    绑定
    [“date”,“startsAt”]
    p1
    p2
    所示。请注意绑定参数值是一个字符串数组。
    另一方面,“date.startsAt”
    将描述顶级属性的路径
    {“date.startsAt”:…}
    而不是顶级属性date的嵌套属性startsAt,如
    {“date”:{“startsAt”:…}

    您对日期[*]所做的操作。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
    

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

    • dates[*].startsAt
      不是有效的属性路径,而是日期返回日期.startsAt中日期的
      的简写表达式,返回数组

    • 比较运算符
      =
      不能像您所想的那样在数组上工作。
      null
      true
      false
      以及每个数字和字符串都比任何数组小,请参见。您的时间戳数组将始终大于任何给定的时间戳字符串。您可能需要的是一个like
      ALL>=

    • 表达式
      dates[*].startsAt
      不能用作绑定参数。对于没有数组的文档结构,如
      {“date”:{“startsAt”:“…”}
      绑定
      [“date”,“startsAt”]
      p1
      p2
      所示。请注意绑定参数值是一个字符串数组。
      另一方面,“date.startsAt”
      将描述顶级属性的路径
      {“date.startsAt”:…}
      而不是顶级属性date的嵌套属性startsAt,如
      {“date”:{“startsAt”:…}

      您对日期[*]所做的操作。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
    

    是否有理由以这种格式存储日期?这样的日期只是字符串,并且您使用的是字符串比较器,因为日期不是数据类型。如果您将所有日期转换为UTC 0的Unix历元时间(毫秒精度)然后处理整数,日期比较就变得容易多了。您需要构建函数来确定给定日期的Unix历元时间整数,但一旦完成,就更简单了。是否有理由以这种格式存储日期?这样的日期只是字符串,而您使用的是字符串比较器,因为日期不是数据类型如果您将所有日期转换为UTC 0的Unix历元时间(毫秒精度),那么您将处理整数,并且日期比较变得更容易。您需要构建函数来确定给定日期的Unix历元时间整数,但一旦完成,就更简单了。