【问题标题】:AQL: Dynamic query with nested array datesAQL:具有嵌套数组日期的动态查询
【发布时间】:2018-05-14 09:00:31
【问题描述】:

我一直在尝试让这个动态查询在 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
    } 
} 

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

【问题讨论】:

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

标签: arangodb aql arangojs


【解决方案1】:

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

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

  • 比较运算符&gt;= 不能像您想象的那样在数组上工作。 nulltruefalse 以及每个 numberstring 都小于任何 array,请参阅 Type and Value Order。您的时间戳 array 将始终大于任何给定的时间戳 string。您可能想要的是 array comparison operator,例如 ALL &gt;=

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多