標籤:簡單 情境 特性 查詢 idt 產生 world 空間 http
國慶放大假,隨手翻了一下娃的英語詞彙題,看到了idea、opinion、view和thought四個選項,忽然就想到了MongoDB的新特性Read-Only View,所以就順便推廣一下。
記得MongoDB World上宣布MongoDB下一個版本3.4會帶來很多為之眼前一亮的新特性,其中第一個就是View,所以國慶長假期間,我們就先睹為快吧!
出世
View這個詞對專業人士來說不是很陌生,翻譯一下就是“視圖”。在MongoDB之前的版本裡面,如果要構造一個集合的子集,個人理解應該有兩個辦法,一是重新建立一個集合,冗餘一下下,還是很方便的。這種方法效能基本沒有影響,但是如果資料是動態變化的,同步會有些小小麻煩。二來就是直接操刀用MongoDB彙總架構來完成,不過說實在的,太多中括弧、大括弧,有時候看的都嫌累。
於是視圖騰空出世也非偶然,而且絕對是開“大陽線”的時候了!
在Mongo的視圖裡,是不存在真正的資料的,可以把它簡單的看成是一個“偽集合”。需要訪問視圖的內容時,視圖資料都是通過即時彙總來自於源集合的。很顯然,完全沒有空間佔用問題,這比冗餘強的太多。當然也有一個小小例外,就是system.views集合,這裡面存放了所有視圖的定義內容,好在占不了多少空間。
構建
視圖的建立非常簡單,db.createView跟著三個參數,第一是視圖名,第二是源集合名,第三是彙總條件。於是我們可以建立一個視圖包含state為“AL”的所有資料:
然後直接通過db.State_AL進行查詢操作,並列舉前3條資料。
操作
瞭解了視圖的建立後,到底可以進行哪些操作呢?
一旦視圖被建立,就可以對視圖進行任何查詢操作,操作內容和標準查詢操作完全一致,而且可以繼續進行彙總架構操作。但是切記,這是唯讀視圖,不能寫!當然,還是有些小小限制的,諸如不能用MapReduce,不能用$text進行全文檢索索引等等。
例如在上面State_AL視圖之上再次進行彙總,只顯示city和zip欄位:
情境
實際上產品最有價值的地方不在功能,而是在於是不是有用武之地,這才是其安身立命之地。所以看看MongoDB的視圖到底能用在哪裡?這才是最關鍵的!
情境一:擴充安全
我們知道MongoDB的安全性整體相比其他非關係型資料庫,整體還是做得不錯的,特別是企業版裡的增強CRUD升級、加密引擎等等。但是安全和方便基本永遠走不到一起,所以配置安全基於角色進列欄位層級控制還是需要費些腦細胞的。
能不能讓安全簡單一些呢?
事實上,視圖就是一個不錯的方法。假設您有一個資料集合包含了所有的資料,但是我不想把所有的資料都開放給開發人員訪問,如信用卡欄位、社會安全號碼等等,那麼無法進行一個過濾產生一個新的視圖,問題就迎刃而解了。
所以簡單來說,隔離唯讀訪問是一個不錯的視圖用例。
情境二:簡化邏輯
MongoDB的彙總架構確實不錯,而且越來越多的$函數被加入到彙總架構,於是長長的過濾條件寫起來還是挺費時間的。但是通過視圖,那些被頻繁使用的過濾彙總可以被固化下來,那麼針對子集的查詢會變的更簡單、應用邏輯也可簡化。
例如假設應用系統要求每個州只能查本地的zip code,那麼剛才zip資料裡面用$match匹配某一個州的資料的方法就可以非常方便的分割資料,然後繼續被應用訪問。
暗礁
唯讀視圖確實還是蠻好用的,但是重要的事情需要說三遍,唯讀、唯讀、還是唯讀。嘗試寫入當然只能接受失敗:
另外有幾點需要注意一下:
1.動態變化
*視圖資料隨源集合資料變化而動態變化,因為視圖本身並不存放資料,而是即時計算於來源資料集合。
*來源資料集合被刪除時,視圖自然得不到任何資料,返回空。
*而當來源資料刪除後又恢複時,視圖又可完全恢複資料。
2.寄生效率
*視圖不能提升查詢效率,查詢效率完全取決於來源資料集合內的索引情況,所以視圖本身沒有效率的決定權。
3.迭代複用
*視圖可以建立在一個已有視圖上,所以簡單來說是可以迭代操作的。
***************************************************************************************************************
練習1:建立視圖並排序
db.createView("View_attendData","attendData",[{$match:{"sheetId":"5949f0277d6156d5d4c5740d"}},{$sort:{"data.date":-1}}])
練習2:建立視圖並排序、然後選定欄位
db.createView("View_attendData","attendData",[{$match:{"sheetId":"5949f0277d6156d5d4c5740d"}},{$project:{"data.date":1,"_id":0}} ,{$sort:{"data.date":-1}}])
MongoDB建立視圖(十四)