简介:我正在使用 RethinkDB 的更改提要来查看特定文档(而不是整个表)的更改。每条记录如下所示:
{
"feedback": [ ],
"id": "bd808f27-bf20-4286-b287-e2816f46d434" ,
"projectID": "7cec5dd0-bf28-4858-ac0f-8a022ba6a57e" ,
"timestamp": Tue Aug 25 2015 19:48:18 GMT+00:00
}
我有一个进程将项目附加到反馈数组,另一个进程需要观察反馈数组的变化......然后做一些事情(具体来说,只广播通过 websockets附加到反馈的最后一个项目)。我已经将它连接起来,以便它监视整个文档的更新 - 但是,它需要接收完整的文档,然后只获取反馈数组中的最后一项。这感觉太重了,当我需要回来的只是添加的最后一件事时。
用于更新文档的当前代码:
r.table('myTable').get(uuid)
.update({feedback:r.row('feedback').append('message 1')})
.run(conn, callback)(...}
^ 这将在一分钟左右的时间内运行多次,将最新消息添加到“反馈”。
观察变化:
r.table('myTable').get(uuid)
.changes()
.run(conn, function(err, cursor){
cursor.each(function(err, row){
var indexLast = row.old_val ? row.old_val.feedback.length : 0,
nextItem = row.new_val.feedback[indexLast];
// ... do something with nextItem
})
})
最后,这是一个问题(实际上是两部分):
1:当我更新文档(添加到反馈)时,我是否必须update
在整个文档上运行(如我上面的代码),还是可以简单地附加到反馈数组并完成它?
2:我在上面做的方式(接收整个文档并从反馈数组中提取最后一个元素)是唯一的方法吗?或者我可以做类似的事情:
r.table('myTable').get(uuid)
.changes()
.pluck('feedback').slice(8) // <- kicking my ass
.run(conn, function(err, cursor){
cursor.each(function(err, row){
var indexLast = row.old_val ? row.old_val.feedback.length : 0,
nextItem = row.new_val.feedback[indexLast];
// ... do something with nextItem
})
})