簡體   English   中英

arangodb從提交日志中獲取文檔更新日期

[英]arangodb get document update date from commit log

如果存在諸如提交日志之類的事情,是否可以從Arangodb提交日志中獲取記錄更新的數據。 我們有一些文檔,其中有更新,但我們確實更新了其修改日期字段。 但是,我們希望檢索自某個日期以來的所有更新/更改的文檔。

有兩種解決方案:

解決方法一

第一種解決方案是不使用提交日志,而是在集合上運行AQL查詢,並在modified日期字段上進行過濾。 如果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);

解決方法二

第二種解決方案是使用ArangoDB也通過其HTTP API公開的WAL更改日志。 但這要復雜得多,並且需要在客戶端保持狀態。

基本思想是在/_api/replication/logger-follow中查詢給定集合的WAL更改日志API。 可以給此API調用一個初始滴答值。 這可以控制請求從更改日志中的何處開始查找。 在開始時,此滴答值尚不清楚,因此只需將其忽略即可。 使用curl,收集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}}
...

可以看出,更改日志不僅包含文檔的插入/更新操作,還包含集合的創建和索引的創建。 它還將包含所有刪除操作和其他更改集合元數據的操作。

使用更改日志結果,您現在可以在客戶端對2300 type的文件進行過濾,這是一個文檔插入或更新操作,然后可以查看data modified了每個返回的文檔。 然后,您可以使用滿足搜索條件的文檔。

請注意,請求的結果可能不包含所有操作,但可能只包含其中的一部分。 可能有必要從服務器獲取更多數據。 這可以通過再次調用API來完成,現在使用X-Arango-Replication-Lastincluded HTTP響應標頭的值作為tick值,例如

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

這將產生更多的操作。 您可以一次又一次調用該API,直到不再產生結果並且X-Arango-Replication-Checkmore HTTP響應標頭的值變為false X-Arango-Replication-Checkmore 這意味着您暫時已經獲取了所有操作。

此解決方案要求客戶端潛在地發出多個HTTP請求並保持狀態(最后獲取的tick值),因此它不像基於AQL的解決方案那樣容易使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM