如果存在提交日誌之類的東西,是否可以從Arangodb提交日誌中獲取記錄更新的數據?我們有幾個文件在哪裏更新,但我們確實更新了他們的修改日期字段。然而,我們希望從特定日期起檢索所有更新/更改的文檔。arangodb從提交日誌中獲取文檔更新日期
回答
這有兩種解決方案:
解決方案一:
第一個解決方案是不使用提交日誌,但在modified
日期字段上運行的收集和過濾器的AQL查詢。如果在modified
字段上存在排序索引(即,跳過列表索引),這將是有效的。
設置示例這可以在下面的安裝腳本,其中填充的集合test
與50K文件隨機修改日期發現:
/* 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);
解決方法二:
第二個解決方案是使用WAL變化日誌ArangoDB經由其HTTP API也暴露。但是這更復雜,需要在客戶端保持狀態。
其基本思想是查詢給定集合的/_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}}
...
可以看出更改日誌不僅包含了文檔的插入/更新操作,而且也收集的創建和索引的創建。它還將包含所有刪除操作以及更改集合的元數據的其他操作。
使用更改日誌結果,您現在可以在客戶端對type
2300(它是文檔插入或更新操作)進行過濾,然後查看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
。這意味着你暫時取得了所有的操作。
該解決方案要求客戶端可能發出多個HTTP請求並保持狀態(最後獲取的值爲tick
),因此它不像基於AQL的解決方案那樣容易使用。
- 1. Cassandra - 歸檔提交日誌
- 2. Arangodb日誌記錄文件
- 3. 如何從JGit獲取作者日期和提交日期RevCommit
- 4. 從Java日誌文件中提取錯誤日期和消息
- 5. 從Lucene獲取日期對象文檔
- 6. 如何從rsync日誌中獲取新的更新文件
- 7. 從putty中提取日誌
- 8. 從日誌文件中提取日誌時間
- 9. JDBC SQLite日誌文件從不提交
- 10. 從日誌文件中提取值
- 11. 更新ArangoDB子文檔
- 12. 根據日期提取mongo文檔
- 13. SQL查詢從XML文檔獲取最新日期
- 14. 如何從特定日期獲取最新文檔?
- 15. 通過日期獲取顛覆日誌
- 16. ArangoDB獲取文檔索引
- 17. PHP獲取特定提交的Git更改日誌
- 18. 獲取以前的SVN更新日誌
- 19. 獲取Mercurial中的提取和更新日期
- 20. 從MYSQL中提取日期
- 21. 從datepickers中提取日期
- 22. CMD日期更改日誌
- 23. TFS獲取最新日誌
- 24. 從日期和時間提取日期
- 25. 提取日誌文件
- 26. Google文檔更改日期
- 27. 獲取僅關於1個文件夾的提交日誌
- 28. 如何在Github中查看文件的提交歷史記錄時獲取提交日期和合並日期?
- 29. 從文本中提取日期
- 30. 從文本中提取日期
解決方案一的確是最容易的,這就是我們如何設置我們的腳本,而不是使用更新日期更新該列。因此我們考慮探索提交日誌。將深入解決方案2.謝謝 – iswak