查询数组的 ArangoDB
Query ArangoDB for Arrays
我在 java 中查询 ArangoDB 的数组值时遇到问题。我试过 String[] 和 ArrayList,都没有成功。
我的查询:
FOR document IN documents FILTER @categoriesArray IN document.categories[*].title RETURN document
绑定参数:
Map<String, Object> bindVars = new MapBuilder().put("categoriesArray", categoriesArray).get();
categoriesArray
包含一堆字符串。我不确定为什么它没有 return 任何结果,因为如果我使用查询:
FOR document IN documents FILTER "Politics" IN document.categories[*].title RETURN document
我得到了我想要的结果。只是在使用 Array 或 ArrayList 时不是。
我也试过查询:
FOR document IN documents FILTER ["Politics","Law] IN document.categories[*].title RETURN document
为了模拟 ArrayList,但这 return 没有任何结果。我会使用一堆单独的字符串进行查询,但是数量太多,并且在使用这么长的字符串进行查询时,我从 Java 驱动程序中收到错误。因此,我必须使用 Array 或 ArrayList 进行查询。
类别数组的示例:
["Politics", "Law", "Nature"]
数据库的示例图像:
原因是 IN
运算符通过在右侧数组的每个成员中搜索其左侧的值来工作。
对于以下查询,如果 "Politics" 是 document.categories[*].title
的成员,这将起作用:
FOR document IN documents FILTER "Politics" IN document.categories[*].title RETURN document
但是,即使 "Politics" 是 document.categories[*].title
的成员,以下查询也不起作用:
FOR document IN documents FILTER [ "Politics", "Law" ] IN document.categories[*].title RETURN document
这是因为它会在右侧的每个成员中搜索确切的值[ "Politics", "Law" ]
,而不会出现这个。您可能正在寻找的是分别查找 "Politics"
和 "Law"
的比较,例如:
FOR document IN documents
LET contained = (
FOR title IN [ "Politics", "Law" ] /* or @categoriesArray */
FILTER title IN document.categories[*].title
RETURN title
)
FILTER LENGTH(contained) > 0
RETURN document
Arango(现在)也有 Array Comparison Operators 允许搜索 ALL IN
、ANY IN
或 NONE IN
[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false
[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true
[ 1, 2, 3 ] NONE IN [ 3 ] // false
[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true
[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false
[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true
[ 1, 2, 3 ] ANY == 2 // true
[ 1, 2, 3 ] ANY == 4 // false
[ 1, 2, 3 ] ANY > 0 // true
[ 1, 2, 3 ] ANY <= 1 // true
[ 1, 2, 3 ] NONE < 99 // false
[ 1, 2, 3 ] NONE > 10 // true
[ 1, 2, 3 ] ALL > 2 // false
[ 1, 2, 3 ] ALL > 0 // true
[ 1, 2, 3 ] ALL >= 3 // false
["foo", "bar"] ALL != "moo" // true
["foo", "bar"] NONE == "bar" // false
["foo", "bar"] ANY == "foo" // true
所以您现在可以过滤:
FOR document IN documents
FILTER ["Politics", "Law] ANY IN (document.categories[*].title)[**]
RETURN document
我在 java 中查询 ArangoDB 的数组值时遇到问题。我试过 String[] 和 ArrayList,都没有成功。
我的查询:
FOR document IN documents FILTER @categoriesArray IN document.categories[*].title RETURN document
绑定参数:
Map<String, Object> bindVars = new MapBuilder().put("categoriesArray", categoriesArray).get();
categoriesArray
包含一堆字符串。我不确定为什么它没有 return 任何结果,因为如果我使用查询:
FOR document IN documents FILTER "Politics" IN document.categories[*].title RETURN document
我得到了我想要的结果。只是在使用 Array 或 ArrayList 时不是。
我也试过查询:
FOR document IN documents FILTER ["Politics","Law] IN document.categories[*].title RETURN document
为了模拟 ArrayList,但这 return 没有任何结果。我会使用一堆单独的字符串进行查询,但是数量太多,并且在使用这么长的字符串进行查询时,我从 Java 驱动程序中收到错误。因此,我必须使用 Array 或 ArrayList 进行查询。
类别数组的示例:
["Politics", "Law", "Nature"]
数据库的示例图像:
原因是 IN
运算符通过在右侧数组的每个成员中搜索其左侧的值来工作。
对于以下查询,如果 "Politics" 是 document.categories[*].title
的成员,这将起作用:
FOR document IN documents FILTER "Politics" IN document.categories[*].title RETURN document
但是,即使 "Politics" 是 document.categories[*].title
的成员,以下查询也不起作用:
FOR document IN documents FILTER [ "Politics", "Law" ] IN document.categories[*].title RETURN document
这是因为它会在右侧的每个成员中搜索确切的值[ "Politics", "Law" ]
,而不会出现这个。您可能正在寻找的是分别查找 "Politics"
和 "Law"
的比较,例如:
FOR document IN documents
LET contained = (
FOR title IN [ "Politics", "Law" ] /* or @categoriesArray */
FILTER title IN document.categories[*].title
RETURN title
)
FILTER LENGTH(contained) > 0
RETURN document
Arango(现在)也有 Array Comparison Operators 允许搜索 ALL IN
、ANY IN
或 NONE IN
[ 1, 2, 3 ] ALL IN [ 2, 3, 4 ] // false
[ 1, 2, 3 ] ALL IN [ 1, 2, 3 ] // true
[ 1, 2, 3 ] NONE IN [ 3 ] // false
[ 1, 2, 3 ] NONE IN [ 23, 42 ] // true
[ 1, 2, 3 ] ANY IN [ 4, 5, 6 ] // false
[ 1, 2, 3 ] ANY IN [ 1, 42 ] // true
[ 1, 2, 3 ] ANY == 2 // true
[ 1, 2, 3 ] ANY == 4 // false
[ 1, 2, 3 ] ANY > 0 // true
[ 1, 2, 3 ] ANY <= 1 // true
[ 1, 2, 3 ] NONE < 99 // false
[ 1, 2, 3 ] NONE > 10 // true
[ 1, 2, 3 ] ALL > 2 // false
[ 1, 2, 3 ] ALL > 0 // true
[ 1, 2, 3 ] ALL >= 3 // false
["foo", "bar"] ALL != "moo" // true
["foo", "bar"] NONE == "bar" // false
["foo", "bar"] ANY == "foo" // true
所以您现在可以过滤:
FOR document IN documents
FILTER ["Politics", "Law] ANY IN (document.categories[*].title)[**]
RETURN document