我一直在尝试使用这个动态查询来处理日期,如下面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
}
}
需要一些帮助才能超越这个
答案 0 :(得分:1)
您的查询中存在错误,但它们实际上与日期无关:
dates[*].startsAt
不是有效的属性路径,而是FOR date IN dates RETURN date.startsAt
的简写表达式,它返回一个数组
您可能认为比较运算符>=
对数组不起作用。 null
,true
,false
以及每个数字和字符串都少于任何数组,请参阅Type and Value Order。您的时间戳数组将始终大于任何给定时间戳字符串。您可能需要的是array comparison operator,例如ALL >=
。
表达式dates[*].startsAt
不能用作绑定参数。如果文档结构没有像{ "date": { "startsAt": "..." } }
这样的数组,那么将["date", "startsAt"]
绑定为p1
或p2
就完全没问了。请注意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
}