2016-11-09 6 views
1

커밋 로그와 같은 것이 있으면 Arangodb 커밋 로그에서 업데이트 된 데이터를 얻을 수 있습니까? 우리는 업데이트가 있지만 수정 된 날짜 필드를 업데이트 한 몇 가지 문서를 가지고 있습니다. 그러나 특정 날짜 이후에 업데이트 된/변경된 모든 문서를 검색하고자합니다.arangodb 커밋 로그에서 문서 업데이트 날짜를 얻습니다.

해결 방법 1 :

첫 번째 솔루션은 로그를 커밋 사용하지만 modified 날짜 필드에 수집 및 필터에 AQL 쿼리를 실행하지 않는 것입니다

답변

2

이 두 가지 솔루션이 있습니다 . modified 입력란에 정렬 된 색인 (즉, skiplist 색인)이 있으면 효율적입니다.

이에 대한 예로 설정은 임의 수정 날짜와 50K 문서 모음 test을 채 웁니다 다음 설치 스크립트에서 찾을 수 있습니다

다음
/* use some fixed base date to make query produce results */ 
var baseDate = 1478779081650; /* 2016-11-10T11:58:01.650Z */ 
db._create("test"); 
db.test.ensureIndex({ type: "skiplist", fields: [ "modified" ]}); 

/* create 50,000 documents with modified dates between 
    2016-11-10T11:58:01.650Z and up to two years in the past */ 
for (var i = 0; i < 50000; ++i) { 
    db.test.insert({ value: i, modified: new Date(baseDate - Math.floor(Math.random() * 1000 * 60 * 60 * 24 * 365 * 2)).toISOString() }); 
} 

A의 문서를 찾을하는 것이 솔직 AQL을 사용하여 특정 값보다 modified 일 이상 :

var query = "FOR doc IN test FILTER doc.modified >= @date RETURN doc"; 
/* find all documents modified since 2016-11-09T12:00:00.000Z */ 
var docs = db._query(query, { date: "2016-11-09T12:00:00.000Z" }).toArray(); 
require("internal").print(docs); 

이 날짜 범위, 예를 들어,에 쿼리를 할 수도 있습니다

var query = "FOR doc IN test FILTER doc.modified >= @from && doc.modified <= @to RETURN doc"; 
var docs = db._query(query, { from: "2016-11-09T00:00:00.000Z", to: from: "2016-11-09T23:59:59.999Z" }).toArray(); 
require("internal").print(docs); 

해결 방법 2 :

두 번째 솔루션은 ArangoDB은 또한 HTTP API를 통해 노출하는 WAL 변경 로그를 사용하는 것입니다. 그러나 이것은 훨씬 더 복잡하며 클라이언트 측에서 상태를 유지해야합니다.

기본 아이디어는 주어진 컬렉션에 대해 /_api/replication/logger-follow에있는 WAL 변경 로그 API를 쿼리하는 것입니다. 이 API 호출의 초기 값은 tick입니다. 이것은 변경 로그에서 요청이 검색되기 시작하는 위치를 제어합니다. 처음에는이 틱 값이 명확하지 않으므로 간단히 생략하십시오. 컬을 사용하여 컬렉션 test에 대한 호출은 다음과 같습니다

curl -X GET "http://127.0.0.1:8529/_db/_system/_api/replication/logger-follow?collection=test" --basic --user "root:" --dump - 

연대순으로, 예를 들어,의 컬렉션에 대한 상태 정보와 일부 HTTP 헤더와 WAL 항목을 생산할 예정이 API에 대한 모든 호출

... 
X-Arango-Replication-Checkmore: true 
X-Arango-Replication-Lastincluded: 6103060 
X-Arango-Replication-Lasttick: 6251758 
... 
{"tick":"6101295","type":2000,"database":"1","cid":"6101294","cname":"test","data":"cid":"6101294","deleted":false,"doCompact":true,"indexBuckets":8,"isSystem":false,"isVolatile":false,"maximalSize":33554432,"name":"test","type":2,"version":5,"waitForSync":false}} 
{"tick":"6101298","type":2100,"database":"1","cid":"6101294","cname":"test","data":{"fields":["modified"],"id":"6101297","sparse":false,"type":"skiplist","unique":false}} 
{"tick":"6101302","type":2300,"tid":"0","database":"1","cid":"6101294","cname":"test","data":"_id":"test/6101300","_key":"6101300","_rev":"6101300","modified":"2015-06-26T14:18:30.732Z","value":0}} 
{"tick":"6101305","type":2300,"tid":"0","database":"1","cid":"6101294","cname":"test","data":"_id":"test/6101304","_key":"6101304","_rev":"6101304","modified":"2016-11-09T07:14:08.146Z","value":1}} 
{"tick":"6101308","type":2300,"tid":"0","database":"1","cid":"6101294","cname":"test","data":"_id":"test/6101307","_key":"6101307","_rev":"6101307","modified":"2015-05-14T04:45:01.202Z","value":2}} 
... 

으로 변경 로그는 문서의 삽입/업데이트 작업뿐만 아니라 컬렉션의 생성 및 인덱스의 생성뿐만 아니라 포함 볼 수 있습니다. 또한 모든 제거 조작과] 렉션의 메타 데이터를 변경하는 기타 조작을 포함합니다.

변경 로그 결과를 사용하여 문서 삽입 또는 업데이트 작업 인 type 2300에 대한 클라이언트 쪽에서 필터링 한 다음 data으로 들여다 볼 수 있습니다. 반환 된 각 문서의 modified. 그런 다음 검색 조건을 만족하는 문서를 사용할 수 있습니다.

요청 결과에 모든 작업이 포함되어 있지는 않지만 일부 작업 만 포함될 수 있습니다. 서버에서 더 많은 데이터를 가져와야 할 수도 있습니다.이는 X-Arango-Replication-Lastincluded HTTP 응답 헤더의 값을 tick 값 (예 : tick)으로 사용하여 API를 다시 호출하여 수행 할 수 있습니다.

curl -X GET "http://127.0.0.1:8529/_db/_system/_api/replication/logger-follow?collection=test&from=6103060" --basic --user "root:" --dump - 

이렇게하면 더 많은 작업이 생성됩니다. 결과가 더 이상 생성되지 않고 X-Arango-Replication-Checkmore HTTP 응답 헤더의 값이 false이 될 때까지 API를 계속해서 호출 할 수 있습니다. 즉, 당분간 모든 작업을 가져 왔습니다.

이 솔루션을 사용하려면 클라이언트가 여러 HTTP 요청을 보류하고 상태 (마지막으로 가져온 tick 값)를 가져와야하므로 AQL 기반 솔루션처럼 사용하기 쉽지 않습니다.

+0

해결책 1이 실제로 가장 쉽습니다. 즉, 우리가 스크립트를 설치했지만 업데이트 날짜가있는 해당 열을 업데이트하지 않는 경우입니다. 따라서 우리는 커밋 로그를 탐색하려고합니다. 솔루션으로 뛰어 들기 2. 감사 – iswak