字符串的ArangoDB查询列表

时间:2015-01-08 22:58:54

标签: graph-databases arangodb aql nosql

我对ArangoDB相对较新,在阅读了文档后,我试图为新项目实现它。

我有一个文档集合,并在每个文档中都有一个列表,其中包含许多术语。我正在使用java驱动程序,并且想查询其列表与我所拥有的列表中的任何元素匹配的文档。

示例:

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

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

myArrayList:
["purple", "red"]

由于我试图查询的ArrayList包含单词" red",我应该同时出现文档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 个答案:

答案 0 :(得分:3)

我建议使用IN运算符进行过滤,如下所示:

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

如果tokens属性是一个数组且包含@myArrayList绑定参数中包含的任何值,则只返回文档。

答案 1 :(得分: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

答案 2 :(得分: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,因为它包含红色和黄色。