AQL фильтр по массиву идентификаторов
Если мне нужно отфильтровать по массиву идентификаторов, как мне это сделать, используя привязки? Документация не дает никаких намеков на это.
for c in commit
filter c.hash in ['b0a3', '9f0eb', 'f037a0']
return c
1 ответ
Обновление ответа для справки с привязками, которые я пропустил.
LET commit = [
{ name: "111", hash: "b0a3" },
{ name: "222", hash: "9f0eb" },
{ name: "333", hash: "asdf" },
{ name: "444", hash: "qwer" },
{ name: "555", hash: "f037a0" }
]
FOR c IN commit
FILTER c.hash IN @hashes
RETURN c
Ключ в том, что когда вы отправляете параметр связывания @hashes
, это должен быть массив, а не строка, содержащая массив.
Если вы используете инструмент AQL Query через ArangoDB Admin Tool, убедитесь, что вы нажимаете кнопку "JSON" в правом верхнем углу, чтобы убедиться, что параметр hashes
имеет значение["b0a3", "9f0eb", "f037a0"]
и не"['b0a3', '9f0eb', 'f037a0']"
Если вы хотите отправить строку в качестве параметра, такого как "b0a3","9f0eb","f037a0"
, так { "hashes": "\"b0a3\",\"9f0eb\",\"f037a0\"" }
в качестве параметра связывания, вы можете разбить строку на массив следующим образом:
LET commit = [
{ name: "111", hash: "b0a3" },
{ name: "222", hash: "9f0eb" },
{ name: "333", hash: "asdf" },
{ name: "444", hash: "qwer" },
{ name: "555", hash: "f037a0" }
]
FOR c IN commit
FILTER c.hash IN REMOVE_VALUE(SPLIT(@hashes, ['","', '"']), "")
RETURN c
Этот пример будет принимать строку @hashes
а потом SPLIT
содержание с помощью ","
а также "
в качестве разделителей. Это преобразует входную переменную в массив, а затем запрос работает, как и ожидалось. Это также попадет в индекс на hash
приписывать.
Разделители заключены в одинарные кавычки, чтобы избежать экранирования, что также возможно, но менее читабельно: ["\",\"", "\""]
Обратите внимание, что ","
сначала указывается в качестве разделителя, так что результат SPLIT[ "", "9f0eb", "b0a3", "f037a0" ]
вместо[ "", ",", "9f0eb", "b0a3", "f037a0" ]
,
Пустой строковый элемент, вызванный первой двойной кавычкой в значении параметра bind, который заставил бы запрос возвращать записи фиксации с пустой строкой в виде хэша, может быть удален с помощью REMOVE_VALUE.
Рекомендуемый путь - пройти ["b0a3", "9f0eb", "f037a0"]
как массив, как показано в начале.
Как это:
with person FOR id in ["person/4201061993070840084011","person/1001230840198901011999","person/4201008406196506156918"]
FOR v,e,p In 1..1 ANY id
relation_samefamily,stay,relation_internetbar,relation_flight,relation_train
OPTIONS {
bfs:true
}
FILTER (p.edges[*]._from ALL IN ["person/42010619930708400840084011","person/10012310840989084001011999","person/4201060840196506156918"] and p.edges[*]._to ALL IN ["person/4201061993070808404011","person/1001231908408901011999","person/4200840106196506156918"])
RETURN {v,e}