2016-11-09 10 views
1

コミットログなどがある場合、Arangodbコミットログから更新されたデータを取得することは可能ですか?いくつかの文書がありますが、ここでは更新は行いましたが、変更した日付フィールドを更新しました。ただし、更新された/変更されたすべてのドキュメントを特定の日付以降に取得したいと考えています。arangodbコミットログからドキュメントの更新日を取得する

ソリューション1

最初のソリューションは、コミットログを使用していますが、modified日付フィールド上で収集し、フィルター上AQLクエリを実行しないことです

答えて

2

は、このための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ベースのソリューションほど使いやすいものではありません。

+0

実際には最も簡単なのは、私たちがスクリプトをセットアップしたのですが、その日付を更新日時に更新しないところです。したがって、コミットログを調べることを考えています。ソリューションへの飛び込み2.感謝 – iswak

関連する問題