7

我在 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包含一堆字符串。我不确定为什么它没有返回任何结果,因为如果我使用以下方式查询:

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,但这不会返回任何结果。我会使用一堆单独的字符串进行查询,但是太多了,当使用这么长的字符串进行查询时,Java 驱动程序会出错。因此,我必须使用 Array 或 ArrayList 进行查询。

类别数组的示例:

["Politics", "Law", "Nature"]

数据库的示例图像:

在此处输入图像描述

4

2 回答 2

10

原因是IN运算符通过在右侧数组的每个成员中搜索其左侧的值来工作。

使用以下查询,如果“政治”是以下成员,这将起作用document.categories[*].title

FOR document IN documents FILTER "Politics" IN document.categories[*].title RETURN document

但是,即使“政治”是以下成员,以下查询也不起作用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
于 2015-01-14T08:07:17.180 回答
2

Arango 也(现在)具有允许搜索、、或的数组比较运算符ALL INANY INNONE 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
于 2020-03-17T12:36:39.613 回答