概要: 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
}
フィードバック配列にアイテムを追加するプロセスが1つあり、フィードバック配列の変更を監視する必要がある別のプロセスがあります...そして何かを行います(具体的には、フィードバックに最後に追加されたアイテムのみをwebsockets経由でブロードキャストします)。ドキュメント全体の更新を監視するように配線しましたが、完全なドキュメントを受信してから、フィードバック配列の最後の項目だけを取得する必要があります。戻す必要があるのは最後に追加されたものだけである場合、これは過度に重く感じます。
ドキュメントの更新に使用される現在のコード:
r.table('myTable').get(uuid)
.update({feedback:r.row('feedback').append('message 1')})
.run(conn, callback)(...}
^ これは 1 分程度の間に数回実行され、最新のメッセージが「フィードバック」に追加されます。
変更の監視:
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
})
})
最後に、ここに質問があります (実際には 2 つの部分):
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
})
})