MongoDB的集合(collection)可以看做關係型資料庫的表,文檔對象(document)可以看做關係型資料庫的一條記錄。但兩者並不完全對等。表的結構是固定的,MongoDB集合并沒有這個約束;另外,存入集合的文檔對象甚至可以嵌入子文檔,或者“子集合”。他們最終都可以用類似於BJSON的格式描述。我們今天就來分析MongoDB這一特性帶來的獨特資料管理方式。我們還是以samus驅動為例來分析,samus驅動支援兩種方式訪問資料庫,基本方式和linq方式,基本方式在上篇以介紹過,linq方式我不想單獨講解應用執行個體,這篇我會用兩種方式來對比介紹。
一、包含子文檔的集合操作
有這麼一個應用情境,某網站提供會員登入的功能,使用者需要註冊帳號才能享受會員服務,但是註冊者可能會因為使用者資料表單輸入項過大而放棄填寫,因此使用者資訊分為主要資料和詳細資料兩項,初次註冊只需要填寫主要資料就行了。我們打算把詳細資料設計為子文檔儲存。
1) linq方式實現
1. 建立資料描述類,描述使用者資訊 view source print ?
06 |
public string UserId { get; set; } |
07 |
public string UserName { get; set; } |
08 |
public string PassWord { get; set; } |
09 |
public Detail Detail { get; set; } |
17 |
public string Address { get; set; } |
18 |
public int Age { get; set; } |
19 |
public string Email { get; set; } |
2. 我們要建立一個使用者業務操作類“UserBLL”。這個時候要讓驅動知道UserInfo類描述了“使用者資料”的欄位資訊,在GetMongo()方法實現了配置步驟,UserBLL完整代碼如下: view source print ?
03 |
public string connectionString = "mongodb://localhost"; |
04 |
public string databaseName = "myDatabase"; |
07 |
private MongoDatabase mongoDatabase; |
10 |
private MongoCollection<UserInfo> mongoCollection; |
15 |
mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase; |
16 |
mongoCollection = mongoDatabase.GetCollection<UserInfo>() as MongoCollection<UserInfo>; |
25 |
/// 配置Mongo,將類UserInfo映射到集合 |
27 |
private Mongo GetMongo() |
29 |
var config = new MongoConfigurationBuilder(); |
30 |
config.Mapping(mapping => |
32 |
mapping.DefaultProfile(profile => |
34 |
profile.SubClassesAre(t => t.IsSubclassOf(typeof(UserInfo))); |
36 |
mapping.Map<UserInfo>(); |
38 |
config.ConnectionString(connectionString); |
39 |
return new Mongo(config.BuildConfiguration()); |
3. 接著,在“UserBLL”類中定義一個方法“InsertSomeData()”來插入一些資料: show source view source print ?
04 |
public void InsertSomeData() |
06 |
UserInfo userInfo1 = new UserInfo() |
12 |
mongoCollection.Save(userInfo1); |
14 |
UserInfo userInfo2 = new UserInfo() |