2015-08-25 26 views
2

簡介:我正在使用RethinkDB的更改源觀察特定文檔(而不是整個表)上的更改。每個記錄是這樣的: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 
    }) 
}) 

最後,這裏的問題(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 
    }) 
}) 

回答

3

讓我們對您的問題

1:當我更新(添加到反饋)的文件, 我必須在其上運行的更新整個文檔(如上面我的代碼),

不,你不知道。正如你所做的那樣,你只更新feedback字段。不是完全的文件,不是嗎?

還是有可能簡單地附加到反饋數組並完成它?

這是可能的。你已經做到了。

它寫的方式看起來像你的客戶端驅動程序必須獲取feedback數組的內容,然後追加一個新元素,並將整個內容更新回來。但這不是這種情況。整個查詢r.row('feedback').append('message 1')被序列化爲JSON字符串並傳遞給RethinkDB。 RethinkDB以原子方式在服務器上運行它。 feedback的內容和追加不在客戶端上完成,也不發送回服務器。

如果使用tcpdump這樣的:

tcpdump -nl -w - -i lo0 -c 500 port 28015|strings 

你可以看到這個JSON字符串是發送者當您運行查詢RethinkDB服務器:

[1,[53,[[16,[[15,["myTable"]],1]],[69,[[2,[3]],{"feedback":[29,[[170,[[10,[3]],"feedback"]],"doc2"]]}]]]],{}] 

是的,單一的JSON查詢被transmited通過網絡,而不是整個文件。希望它是有道理的。該JSON字符串的更多信息,請http://rethinkdb.com/docs/writing-drivers/https://github.com/neumino/rethinkdbdash/blob/master/lib/protodef.js#L84

2可以看出:是我做它上面的方式(接收整個文檔和拔毛從反饋數組的最後一個元素),要做到這一點的唯一方法?或者我可以這樣做:

理想情況下,我們希望使用括號來獲取文檔的字段,並在該字段上偵聽更改。不幸的是它還沒有工作。所以我們必須使用map來轉換它。同樣,在服務器上運行此,只有最後一個文件傳送到客戶端,而不是整個文件:

r.table('myTable').get(1).changes().map(function(doc) { 
    return doc('new_val')('feedback').default([]).nth(-1) 
}) 
+0

過了一段時間我批准答案,但想要說聲謝謝,正是我一直在尋找! – jiveTurkey

+0

我很高興它可以幫助你 – kureikain

相關問題