Могу ли я использовать встроенные выражения в моем aql для условия фильтра - PullRequest
0 голосов
/ 18 января 2019

Могу ли я использовать встроенные выражения в моем aql для условия фильтра, подобного этому:

for u in folders filter u.gacl[* filter contains(CURRENT.permissions,'c') and CURRENT.principal == 'users/12345'] return u

Пример данных:

my sample data is:
 {
  "_key": "key-002",
  "_id": "folders/key-002",
  "_rev": "_YDQN32G--_",
  "guser": "users/12345",
  "code": "key-001",
  "gacl": [
    {
      "principal": "users/12345",
      "permissions": "rwd",
      "flags": "",
      "type": "A"
    }
  ],
  "isRoot": true,
  "gtime": "1527675486269",
  "gstatus": 0,
  "name": "f1",
  "guid": "key-001",
  "bosclass": "folders"
}

Я пытался, но это не работает.

1 Ответ

0 голосов
/ 18 января 2019

Полагаю, вы ожидаете, что этот запрос не вернет совпадающих документов, но он все равно возвращает документ, даже если значение "permissions" не соответствует ожидаемому.

Это объясняется выражением запроса FILTER:

u.gacl[* filter contains(CURRENT.permissions,'c') and CURRENT.principal == 'users/12345']

В этом выражении используется оператор звезды, который всегда создает массив в качестве результата. Поскольку никакие элементы массива не соответствуют фильтру, используемому для отдельных элементов, результатом всего выражения является просто пустой массив:

[]

Таким образом, условие FILTER запроса преобразуется в

FILTER []

И [] равно true при преобразовании в логический фильтр (

Таким образом, при использовании этого условия FILTER каждый документ будет соответствовать.

Изменение условия на

FILTER LENGTH(u.gacl[* filter contains(CURRENT.permissions,'c') and CURRENT.principal == 'users/12345']) > 0

должен делать то, что вы хотите.

...