2013-07-24 23 views
2

我試圖刪除文件數據的某些部分與給定結構相當簡單,這將得到比這更深刻和更重的項目Rethinkdb刪除數據雲:從文件

{ 
    id: "...", 
    name: "...", 
    phone: "...", 
    data: { 
     key1: "val1", 
     ... 
    } 
    ... 
} 

我意識到除了用更新的樹替換整個樹之外,沒有辦法更新/刪除嵌套部分中的部分。

例如,如果我想從文檔數據刪除鍵1,我需要在那裏key1的不包含

document.update({data: new dict without key1}) 

它的副本更新文檔中的數據部分是否有刪除的任何eaiser方式部分來自類似文檔的名稱字段的根目錄 - 而不用包含名稱鍵和值的自身副本更新整個文檔?每次我需要刪除部分數據時,是否必須深度複製和過濾文檔?

回答

5

下面是一個查詢,將刪除文件的根鍵:

r.table('foo').get(document_id).replace(r.row.without('key')) 

你也可以做到這一點對多個文檔如下:

r.table('foo').filter(condition).replace(r.row.without('key')) 

隨着即將到來的1.8版本的,您還可以按如下方式對嵌套鍵進行操作:

r.table('foo').get(document_id).replace(r.row.without({data: { key1: true}})) 

目前,com上面的mands基本上用它自己的副本替換文檔,而沒有在服務器上的相關密鑰。在接下來的幾個版本中,這將大量優化,以儘量減少文件複製在內存中(所以雖然它看起來像你與自己的副本替換文檔無需鑰匙,操作將破壞性沒有任何複製執行的引擎蓋下) 。未來版本可能會更新底層結構,以便不必將完整文檔寫入磁盤。

如果使用without命令,你就不必做任何事情來充分利用這些優化的(除了升級服務器)。

希望這會有所幫助。

+0

謝謝光榮。我急切地等待下一個版本,rethinkdb目前爲止很漂亮。 。 – hinoglu

+0

HM r.table( 「CV」)獲得( 「e1a8b71f-ba52-4fd4-8c3a-e981df1e3108」)更新(r.row.without( 「名字」))將返回 「不變:1」,文件仍然有名稱字段。我正在使用1.7.3 ubuntu release – hinoglu

+0

對不起,不要'更新'請使用'替換'。我應該知道比在4點發布答案更好:)我會更新帖子。 – coffeemug