假設(shè)我們的實體定義如下:
public class Contact{[BsonId][BsonRepresentation(BsonType.ObjectId)]public string Id { get; set; }public string Name { get; set; }public string Company { get; set; }public string Title { get; set; }public int[] GroupIds { get; set; }public IList<Group> Groups { get; set; }}public class Group{[BsonId][BsonRepresentation(BsonType.ObjectId)]public string Id { get; set; }public int GroupId { get; set; }public string Name { get; set; }}那么 , 可以通過Driver實現(xiàn)以下操作:
public async Task<IList<Contact>> GetAsync(){return await _contacts.Aggregate().Lookup<Contact, Group, Contact>(_groups,local => local.GroupIds,from => from.GroupId,result => result.Groups).ToListAsync();}完整示例github地址:https://github.com/EdisonChou/EDT.Mongo.Sample
運行結(jié)果如下所示:

文章插圖
什么時候使用引用模式
綜上所述 , 當(dāng)滿足以下條件之一時 , 你可以開始考慮引用模式設(shè)計文檔模型:
(1)當(dāng)內(nèi)嵌后的文檔太大 , 有可能超過16MB限制的時候;
(2)內(nèi)嵌的文檔 或 數(shù)組元素 有可能會頻繁修改的時候;
(3)內(nèi)嵌數(shù)組元素 有可能會持續(xù)增長且沒有封頂?shù)臅r候;
引用模式設(shè)計的限制
引用模式也并非銀彈 , 它存在以下一些限制:
(1)MongoDB對于使用引用的集合之間沒有所謂的外鍵檢查;
(2)MongoDB使用聚合框架的$lookup來模仿關(guān)聯(lián)查詢;
(3)$lookup只支持LEFT OUTER JOIN , 且關(guān)聯(lián)目標(biāo)(from)不能是分片表;
db.Contacts.aggregate([{$lookup:{ from: "groups", // 這里的from不能是分片表......}}]);3 總結(jié)本文簡單介紹了MongoDB的模型設(shè)計中的內(nèi)嵌模式和引用模式 , 探討了引用模式的使用、何時使用 及 使用限制 。
下一篇 , 我們會學(xué)習(xí)MongoDB的模式設(shè)計中的一些設(shè)計模式并套用這些設(shè)計模式簡化設(shè)計難度 。
參考資料
唐建法 , 《MongoDB高手課》(極客時間)
郭遠(yuǎn)威 , 《MongoDB實戰(zhàn)指南》(圖書)
以上關(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)教程
- 做雙眼皮有幾種方法
- 最有激情的健身運動是什么
- 終端凈水,只為能飲用健康好水
