获取一个集合,然后更改它,没有间隙或重叠

时间:2015-03-01 11:13:11

标签: rethinkdb rethinkdb-ruby

如何可靠地获取表格的内容,然后更改它,没有间隙或重叠?我试图随着时间的推移最终得到一致的表格。

我可以先查询数据库,然后订阅更改供稿,但可能存在这些查询之间发生修改的空白。

或者我可以先订阅更改,然后查询表,但随后可能会在查询中已处理的更改Feed中进行修改。

此案例示例:

A subscribe 'messages'
B add 'messages' 'message'
A <- changed 'messages' 'message'
A run get 'messages'
A <- messages

此处A在发送其消息查询之前收到“已更改”消息,并且消息查询的结果包括已更改的消息。可能A可以在收到查询结果之前简单地忽略任何已更改的消息。是否保证在查询之后(在同一连接上)收到的更改尚未在先前的查询中应用,即在同一个线程上处理?

推荐的方式是什么?我在这个用例上找不到任何文档。

2 个答案:

答案 0 :(得分:1)

我知道你说你想出了答案,但我已经做了很多,这就是我一直在做的事情:

r.db('test').table('my_table').between(tsOne, tsTwo, {index: 'timestamp'});

因此,在我的工作中,我运行了一个索引between查询,该查询在上次运行时和该确切时刻之间捕获数据。您可以在配置表上运行锁定,以跟踪作业的last_run_time,以便您甚至可以使用多个处理器进行扩展!而且因为我们正在使用between,所以等待锁定完成的下一个作业只会在第一个处理器运行后获取数据。希望有所帮助!

答案 1 :(得分:1)

RethinkDB的Michael Lucy写道:

  

对于.get.changes.order_by.limit.changes,您应该没问题,因为我们已经为这些发送了查询的初始值。对于其他查询,现在唯一的方法是订阅查询的更改,执行查询,然后从更改源读取并丢弃读取之前的任何更改(如何执行此操作取决于读取的内容)重新执行以及对它进行了哪些法律更改,但最容易入侵的方法可能是在对象中添加timestamp字段,每当进行更新时都会增加该字段。

     

在2.1中,我们计划添加一个可选参数return_initial,它将自动执行我刚才描述的操作,而无需更改文档架构。