2015-01-08 63 views
2

我對ArangoDB相對來說比較新,並且在閱讀完文檔後試圖爲新項目實現它。ArangoDB字符串查詢列表

我有一個文件集合,並且在每個文檔中都有一個列表,其中包含了許多術語。我正在使用java驅動程序,並希望查詢其列表與我擁有的列表中的任何元素匹配的文檔。

例子:

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

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

myArrayList: 
["purple", "red"] 

因爲我嘗試使用查詢ArrayList包含單詞「紅」,我應與文件1和文件2,理想的呈現,我將只與所呈現文件ID和匹配的顏色。

在半僞代碼從我所知道的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屬性是一個數組這將只返回一個文件和包含的任何包含在的值的0綁定參數。

1

我在ArangoDB Google Group上發現了一個關於我的問題的答案。我鏈接到它,因爲它是非常困難的,我找到一個解決方案:H ttps://groups.google.com/forum/#!newtopic/arangodb/arangodb/fen4Nr7N4Uo

我已經適應了代碼,這樣對於我的情況下工作:(感謝STJ的評論固定我寫的)

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

上面的這個查詢將會失敗並出現解析錯誤。圓括號不匹配,如果有子查詢,它應該包含單獨的返回語句。除此之外,如果不過濾掉不包含任何顏色的文檔。我認爲它應該看起來像這樣:'對於文檔IN文檔LET contains =(對於color IN document.tokens FILTER MATCHES(color,@myArrayList)RETURN color)FILTER LENGTH(contains)> 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,因爲它包含紅色和黃色。