2009-12-03 65 views
1

我認爲讀取某個地方時,請求查看時,「地圖」僅在上次請求後添加的文檔上運行?這是如何確定的?我以爲我看到了關於序列號的一些事情。這是你可以得到的東西嗎?它不是_rev字段的UUID尾部的一部分嗎?CouchDB視圖,地圖,索引和序列

任何方式來強制整個視圖(跨所有記錄)的'重新計算'?

回答

1

關於Technical Overview中查看索引的部分是一個很好的指導。

視圖構建器使用數據庫序列ID來確定視圖組是否完全與數據庫保持同步。如果不是,則視圖引擎將檢查自上次刷新後更改的所有數據庫文檔(按照壓縮順序)。文件按磁盤文件中的順序讀取,減少了磁頭尋找的頻率和成本。
在檢查文檔時,如果它們存在,則將從視圖索引中刪除其先前的行值。如果文檔被視圖函數選中,則函數結果將作爲新行插入到視圖中。

CouchDB首先檢查是否有任何在整個數據庫中使用序列標識(每當數據庫中的任何文檔發生更改時都會更新)發生更改。如果事情發生了變化,它會查找這些文檔並在其上運行地圖功能。

實際上不應該有任何需要重建/重新生成視圖,因爲它會在您修改文檔時遞增刷新(請注意,它不會更新視圖,直到您使用它爲止)。用帽子說一種方法(我敢肯定還有更好的方法)是去除描述視圖的設計文檔並再次插入,因爲設計文檔與普通文檔沒有什麼不同(幾乎)。

+0

好的,這讓我有更多的理解,那就是我想象的方式。 +1巧妙的把戲重建視圖。 – BuddyJoe 2009-12-03 19:44:49

+1

我相信最近的CouchDB版本(例如.10.1)使用設計文檔的視圖函數來決定是否重建視圖。因此,重新插入設計文檔*可能不會刷新視圖。當然,更新一個新的視圖功能,但是。 – 2009-12-03 20:21:31

+0

@barry,這是非常有趣的,它是有道理的。你有什麼鏈接到我可以閱讀更多關於視圖函數散列的地方嗎? – 2009-12-04 06:48:18