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