2015-01-14 7 views
4

Java에서 ArangoDB에 Arrays 값을 쿼리하는 데 문제가 있습니다. String []과 ArrayList 둘 다 시도했지만 성공하지 못했습니다.배열에 대한 ArangoDB 쿼리

내 쿼리 :

FOR document IN documents FILTER @categoriesArray IN document.categories[*].title RETURN document 

BindParams :

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를 사용하지 않을 때.

은 또한에 대한 쿼리 시도 : ArrayList에를 에뮬레이트하기 위해

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

하지만,이 결과가 반환되지 않습니다. 일련의 개별 문자열을 사용하여 쿼리 할 것이지만 너무 많아서 String을 사용하여 쿼리 할 때 Java 드라이버에서 오류가 발생합니다. 따라서 Array 또는 ArrayList를 사용하여 쿼리해야합니다.

categoriesArray의 예 :

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

데이터베이스의 샘플 이미지 :

enter image description here

답변

6

이유는 IN 작업자가 왼손의 값을 검색하여 작동한다는 것이다 오른쪽에 배열의 각 구성원에 손 사이드.

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

다음은 "정치가"document.categories[*].title의 구성원 인 경우에도 쿼리를 작동하지 않습니다하지만 : "정치가"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 
+0

'에 대한 것은 LET 어떻게 범주 = [ "정치", "법"]','LET cat_length = 길이 (카테고리) '&'FILTER cat_length == LENGTH (INTERSECTION (categories, document.categories [*]. title))'? 코드는 더 깨끗해 보이지만 성능과 메모리 소비는 걱정할 필요가 없습니다. 또는 AQL의 집합에 대한 지원을 추가 할 수 있습니까? 'FILTER SET ([ "정치", "법"]) IN SET (document.categories [*]. title)'처럼. JS에서, 다음과 같이 할 수 있습니다.'let arr = [ "Law", "Science", "Politics"]; [ "Politics", "Law"]. 모든 (elem => arr.indexOf (elem)! = -1)'. AQL에서'EVERY()'와'SOME()'은 어떨까요? '[Law ","Politics "], doc.categories [*]. title))' – CoDEmanX

+0

AQL에서는'EVERY'와'SOME'이 유용 할 것이라고 나는 동의한다. 함수로 제공하면 가장 직관적 인 구문을 제공 할 수 있을지 모르겠지만 아마도 가장 쉬운 것입니다. – stj