如果存在提交日志之类的东西,是否可以从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