Кратко: я использую каналы изменений 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
}
У меня есть один процесс, который добавляет элементы в массив feedback, и другой процесс, которому нужно следить за изменениями в массиве feedback... и затем что-то делать (в частности, транслировать только последний элемент, добавленный к отзыву через веб-сокеты). Я подключил его так, что он будет отслеживать обновления всего документа, однако для этого требуется получить полный документ, а затем получить только последний элемент в массиве отзывов. Это кажется слишком тяжелым, когда все, что мне нужно, чтобы вернуться, это последнее добавленное.
Текущий код, используемый для обновления документа:
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
})
})
Наконец, вот вопрос (на самом деле 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
})
})