AQL: динамический запрос с датами вложенного массива - PullRequest
0 голосов
/ 14 мая 2018

Я пытался заставить этот динамический запрос работать с датами, как показано ниже в 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 голосов
/ 14 мая 2018

В вашем запросе есть ошибки, но они на самом деле не связаны с датами:

  • dates[*].startsAt не является допустимым путем атрибута, но является сокращенным выражением для FOR date IN dates RETURN date.startsAt,который возвращает массив

  • Оператор сравнения >= не работает с массивами, как вы можете подумать.null, true, false и каждое число и строка меньше любого массива , см. Порядок типов и значений .Ваша временная метка массив всегда будет больше, чем любая заданная временная метка строка .Вместо этого вы, вероятно, захотите использовать оператор сравнения массивов , например ALL >=.

  • Выражение dates[*].startsAt не может использоваться в качестве параметра связывания.Со структурой документа без массива типа { "date": { "startsAt": "..." } } было бы прекрасно связать ["date", "startsAt"] как p1 или p2.Обратите внимание, что значение параметра связывания является массивом строк."date.startsAt", с другой стороны, будет описывать путь для атрибута верхнего уровня
    { "date.startsAt": ... }, а не вложенный атрибут beginAt даты атрибута верхнего уровня, такой как { "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
}
...