2015-01-08 2 views
2

Я относительно новичок в ArangoDB, и после прочтения документов я пытаюсь реализовать его для нового проекта.Список запросов ArangoDB для строк

У меня есть коллекция документов, и в каждом документе есть список, содержащий несколько терминов. Я использую java-драйвер и хотел бы запросить документы, список которых соответствует любому из элементов в списке, который у меня есть.

Пример:

Document 1 
{ 
    tokens["blue", "red", "green"] 
} 

Document 2 
{ 
    tokens["black", "red", "yellow"] 
} 

myArrayList: 
["purple", "red"] 

Поскольку ArrayList Я пытаюсь запросить с помощью которых содержит слово «красный», я должен быть представлен как документ 1 и документ 2. В идеале, я буду представлена ​​только с ID документа и соответствующий цвет.

В пол-psuedocode от того, что я знаю AQL:

FOR document IN documents FILTER document.tokens CONTAINS myArrayList RETURN document.token.color && document._id 

я обычно уже возвращался весь объект документа, а затем просто доступ, что мне нужно. Я мог бы сделать это, если это будет проще. Например:

FOR document IN documents FILTER document.tokens CONTAINS myArrayList RETURN document 

ответ

3

Я полагаю, используя оператор IN для фильтрации следующим образом:

FOR document IN documents 
    FILTER document.tokens IN @myArrayList 
    RETURN document 

Это будет возвращать только документ, если атрибут tokens является массивом и содержит любое из значений, содержащихся в @myArrayList связать параметр.

1

Я нашел ответ на свой вопрос в группе Google ArangoDB. Я ссылки на него, как это было очень трудно для меня, чтобы найти решение: ч ttps://groups.google.com/forum/#!newtopic/arangodb/arangodb/fen4Nr7N4Uo

Я адаптированный код там работать для моего случая: (Кредит на комментарий СТП для фиксации того, что я написал)

FOR document IN documents LET contains = 
(FOR color IN document.tokens FILTER MATCHES(color, @myArrayList) RETURN color) 
FILTER LENGTH(contains) > 0 RETURN document 
+1

Этот запрос, описанный выше, не будет выполнен с ошибками разбора. Скобки не совпадают, и если есть подзапрос, в нем должен быть отдельный оператор возврата. Кроме того, если не отфильтровывать документы, которые не содержат каких-либо цветов. Я думаю, что это должно выглядеть так: 'FOR document IN documents LET contains = (FOR color IN document.tokens FILTER MATCHES (цвет, @myArrayList) RETURN color) FILTER LENGTH (содержит)> 0 RETURN document' – stj

0

Если вы хотите найти документы, которые, по крайней мере содержат все указанные цвета, в любом порядке, вы можете использовать запрос следующим образом:

LET lenArrayList = LENGTH(@myArrayList) 

FOR doc IN documents 
    FILTER HAS(doc, "tokens") // avoid bad calls to INTERSECTION() 
    FILTER LENGTH(INTERSECTION(@myArrayList, doc.tokens)) == lenArrayList 
    RETURN doc 

myArrayList: ["yellow","red"]

Результат: документ 2, потому что он содержит красный и желтый.