繁体   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