Фильтр AQL по массиву идентификаторов

Если мне нужно отфильтровать по массиву идентификаторов, как мне это сделать с помощью привязок? Документация не дает никаких намеков на это.

for c in commit
filter c.hash in ['b0a3', '9f0eb', 'f037a0']
return c

person Ivan Naumenko    schedule 07.11.2017    source источник
comment
Под использованием привязок вы имеете в виду, как использовать параметры привязки вместо литерала массива ['b0a3', '9f0eb', 'f037a0']?   -  person CodeManX    schedule 08.11.2017
comment
Да, это именно то, что я имел в виду @CoDEmanX. Что-то вроде этого for c in commit filter c.hash in @hashes return c или for c in commit filter c.hash in [@hashes] return c На данный момент мой обходной путь № 2, но он выглядит очень грязным в реализации.   -  person Ivan Naumenko    schedule 08.11.2017


Ответы (2)


Обновление ответа для работы со ссылкой на привязки, которую я пропустил.

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, убедитесь, что вы нажали кнопку "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" ].

Элемент пустой строки, вызванный первой двойной кавычкой в ​​значении параметра привязки, из-за которого запрос возвращает записи фиксации с пустой строкой в ​​виде хэша, можно устранить с помощью REMOVE_VALUE.

Однако рекомендуется передавать ["b0a3", "9f0eb", "f037a0"] как массив, как показано в начале.

person David Thomas    schedule 08.11.2017
comment
c.hash это просто строка. Мой запрос предназначен для возврата коммитов с хэшами из массива хэшей, переданного в качестве входного параметра. Вот почему я упомянул bindings или использование параметров привязки. - person Ivan Naumenko; 08.11.2017
comment
Добавлено изображение, показывающее разницу JSON в веб-интерфейсе. Изменен порядок разделителей во втором примере с использованием строки в качестве значения параметра привязки, чтобы избежать элемента ",", и добавлен REMOVE_VALUE(), чтобы также избавиться от элемента "", что может привести к другим результатам запроса. Кроме того, вам не нужно избегать двойных кавычек, если вы используете одинарные кавычки в AQL, который намного лучше читается. - person CodeManX; 10.11.2017

как это:

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}
person toutou tou    schedule 18.12.2018
comment
Ответы, содержащие только код, не приветствуются. Нажмите «Изменить» и добавьте несколько слов, описывающих, как ваш код отвечает на вопрос, или, возможно, объясните, чем ваш ответ отличается от предыдущего ответа/ответов. Спасибо - person Nick; 18.12.2018