は、このための2つのソリューションがあります。これは、modified
フィールドにソートされたインデックス(スカイリストインデックス)がある場合に効率的です。
このための例のセットアップは、ランダムな変更日付と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() });
}
でドキュメントを検索することがストレートフォワードです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:
第2の解決策は、ArangoDBもそのHTTP APIを介して公開することWALの変更ログを使用することです。しかし、これははるかに複雑で、クライアント側で状態を維持する必要があります。
基本的な考え方は、指定されたコレクションのWAL変更ログAPIに/_api/replication/logger-follow
を照会することです。このAPI呼び出しには、最初にtickの値を指定できます。これは、変更履歴のどこから要求が開始されるかを制御します。最初はこのティック値が不明なので、単純に省略してください。 カールを使用して、コレクションtest
のための呼び出しは次のようになります。
curl -X GET "http://127.0.0.1:8529/_db/_system/_api/replication/logger-follow?collection=test" --basic --user "root:" --dump -
このAPIへのすべての呼び出しは、例えば、年代順に収集のための状態情報といくつかのHTTPヘッダとWALエントリが生成されます
...
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
の値として使用して、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ベースのソリューションほど使いやすいものではありません。
実際には最も簡単なのは、私たちがスクリプトをセットアップしたのですが、その日付を更新日時に更新しないところです。したがって、コミットログを調べることを考えています。ソリューションへの飛び込み2.感謝 – iswak