
文章插圖
| 總結(jié)/Edison Zhou
前面我們學習了聚合查詢 , 本篇我們來看看在模型設(shè)計中如何應(yīng)用引用模式來提高查詢效率 。
1 內(nèi)嵌模式
在進行MongoDB的模型設(shè)計中 , 基于JSON文檔模型 , 我們很容易就可以設(shè)計出一個內(nèi)嵌模式的文檔模型出來 。
可以不夸張地說 , 80%~90%的場景下 , 我們優(yōu)先都會使用內(nèi)嵌對象 或 內(nèi)嵌數(shù)組 的方式來設(shè)計文檔模型的所謂的1-1、1-N、N-N的關(guān)系 。
例如下面這個Contacts的文檔模型 , 它描述了一個聯(lián)系人的關(guān)系建模:
Contacts{name: "Edison Zhou",company: "CSCEC YZW",title: ".NET Engineer",portraits: {mimetype: xxx,data: xxxx},addresses: [{ type: home, … },{ type: work, … }],groups: [ {name: "YZW Football Assocation" }, {name: "YZW .NET Assocation" }]}可以看到 , 所謂的內(nèi)嵌類 其實 類似于 預(yù)先聚合(關(guān)聯(lián)) , 這樣的操作(引用+冗余)其實對讀操作更有性能優(yōu)勢 。但是 , 內(nèi)嵌設(shè)計有一個大前提限制:即內(nèi)嵌后文檔大小不能超過16MB 。
此外 , 如果內(nèi)嵌的數(shù)組(通常是數(shù)組)的長度太大 , 比如數(shù)萬或更多的時候 , 也是不適合采用內(nèi)嵌模式的 。
那么 , 此時我們應(yīng)該怎么設(shè)計呢?
2 引用模式
萬級長度的內(nèi)嵌數(shù)組
這里我們?nèi)匀贿m用上面提到的Contacts模型 , 假設(shè)其中的groups是一個內(nèi)嵌數(shù)組 , 這個groups的數(shù)據(jù)可能有百萬級的長度 , 且每個Contacts文檔都需要冗余這么一份數(shù)據(jù) , 而且groups數(shù)據(jù)還面臨著頻繁修改的需求 。
Contacts{name: "Edison Zhou",company: "CSCEC YZW",title: ".NET Engineer",...... // 假設(shè)下面groups有百萬級 , 且一個group的信息改動會引發(fā)百萬級的DB操作groups: [{name: "YZW Football Assocation" },{name: "YZW .NET Assocation" }]}適當使用引用模式解決解決方案很簡單 , 就是針對groups使用單獨的collection來存儲 , 在Contancts模型中添加對group id的集合的引用 。
Collection 1 - Contacts:
Contacts{name: "Edison Zhou",company: "CSCEC YZW",title: ".NET Engineer",......// 假設(shè)下面groups有百萬級 , 且一個group的信息改動會引發(fā)百萬級的DB操作 group_ids: [1,2,3,4,5...]}Collection 2 - Groups:Groups{groups_id,name}這樣的設(shè)計其實類似于關(guān)系型數(shù)據(jù)庫模型的設(shè)計 , 用Id來關(guān)聯(lián) , 我們再熟悉不過了 。但是 , 在MQL中 , 我們就需要額外使用$lookup來實現(xiàn)類似SQL中的關(guān)聯(lián)查詢了 , 嚴格來說 , 應(yīng)該算是LEFT OUTER JOIN查詢 。
嗯 , 這又是一種聚合操作:
db.Contacts.aggregate([{$lookup:{from: "groups",localField: "group_ids",foreignField: "group_id",as: "groups"}}]);這個查詢會得到如下圖所示的結(jié)果:
文章插圖
.NET中的Lookup操作:
上面講解了如何通過MQL進行操作 , 那么 , 在.NET中如何實現(xiàn)$lookup的效果呢?
好在MongoDB Driver已經(jīng)幫我們提供了這樣的一個LookUp , 且看下面的代碼示例:
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- mongodb是nosql數(shù)據(jù)庫嗎 6 NoSQL | MongoDB入門實戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 8 NoSQL | MongoDB入門實戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 11 NoSQL | MongoDB入門實戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 12 NoSQL | MongoDB入門實戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 13 NoSQL | MongoDB入門實戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 14 NoSQL | MongoDB入門實戰(zhàn)教程
- 做雙眼皮有幾種方法
- 最有激情的健身運動是什么
- 終端凈水,只為能飲用健康好水
