字符串的 ArangoDB 查询列表
ArangoDB Query List for Strings
我对 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
我在 ArangoDB Google 组找到了我的问题的答案。我正在链接到它,因为我很难找到解决方案:https://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
我建议使用 IN
运算符进行过滤,如下所示:
FOR document IN documents
FILTER document.tokens IN @myArrayList
RETURN document
如果 tokens
属性是一个数组并且包含 @myArrayList
绑定参数中包含的任何值,这将仅 return 一个文档。
如果你想查找至少包含所有指定颜色的文档,可以按任何顺序使用这样的查询:
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
我的数组列表:["yellow","red"]
结果:文档2,因为它包含红色和黄色。
我对 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
我在 ArangoDB Google 组找到了我的问题的答案。我正在链接到它,因为我很难找到解决方案:https://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
我建议使用 IN
运算符进行过滤,如下所示:
FOR document IN documents
FILTER document.tokens IN @myArrayList
RETURN document
如果 tokens
属性是一个数组并且包含 @myArrayList
绑定参数中包含的任何值,这将仅 return 一个文档。
如果你想查找至少包含所有指定颜色的文档,可以按任何顺序使用这样的查询:
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
我的数组列表:["yellow","red"]
结果:文档2,因为它包含红色和黄色。