2016-11-09 5 views
1

UPDATE 문에는 컬렉션 이름이 필요합니다. 그래프에서 가장자리를 가로 질러 방문한 각 버텍스를 업데이트하려고합니다.ArangoDB AQL에서 컬렉션에 관계없이 모든 통과 된 객체의 필드를 업데이트하려면 어떻게해야합니까?

같은

뭔가 : V 1..50 인바운드 '은 pmconfig/6376876'pm_content 옵션에 대한 {uniqueVertices : "글로벌"} [업데이트는 = 사실 v.contentsChanged] 정점 이후

는 다른에서 찾을 수있다 컬렉션을 개체별로 분할해야합니까?

답변

2

동적 (런타임) 모음 이름을 사용하여 문서를 업데이트 할 수 없습니다. 예를 들어, 다음 AQL 쿼리가 컴파일되지 않습니다 :

FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content 
    UPDATE v WITH { contentsChanged : true } IN PARSE_IDENTIFIER(v._id).collection 

그 이유는 UPDATE 및 기타 데이터 수정 문은 자신의 컬렉션 이름은 컴파일 시간 쿼리에 알려질 필요가있다. 물론 바인드 매개 변수를 사용하면 작동하지만 런타임 표현식은 사용할 수 없습니다.

한 가지 해결 방법은 업데이트 할 하드 코딩 된 컬렉션이있을 때마다 여러 번 탐색을 실행하는 것입니다. 여전히 컬렉션 이름에 대한 지식이 필요합니다. 다른 해결 방법은

FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content 
    FILTER PARSE_IDENTIFIER(v._id).collection == 'vertexCollection1' 
    UPDATE v WITH { contentsChanged : true } IN vertexCollection1 

FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content 
    FILTER PARSE_IDENTIFIER(v._id).collection == 'vertexCollection2' 
    UPDATE v WITH { contentsChanged : true } IN vertexCollection2 

... 

순회 이미 당 수집 목록을 생성해야하고, 각 수집에 대한 문제 후속 쿼리하기 : 사이의 그래프 변경하는 경우에도 일관성 문제가있을 수 있습니다. 예를 들어, 다음 쿼리는 모음별로 업데이트 할 키를 반환해야합니다 :

FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content 
    LET parts = PARSE_IDENTIFIER(v._id) 
    COLLECT collection = parts.collection INTO keys = parts. key 
    RETURN { collection, keys } 

예 결과 :

[  
    { 
    "collection" : "vertexCollection1", 
    "keys" : [ 
     "abc" 
    ]  
    },  
    { 
    "collection" : "vertexCollection2", 
    "keys" : [ 
     "xyz", 
     "ddd" 
    ]  
    } 
] 

을 결과 구조를 사용하여 후속 업데이트 쿼리를 쉽게 구축하고 업데이트 할 수 있습니다 보냈습니다.

+0

감사합니다. 나는 단지 컬렉션 당리스트를 먼저 수행해야한다는 두 번째 의견을 원했다. – ggendel