有這麼一個應用場景,某網站提供會員登陸的功能,用戶須要註冊帳號才能享受會員服務,可是註冊者可能會由於用戶資料表單輸入項過大而放棄填寫,所以用戶信息分爲主要資料和詳細資料兩項,初次註冊只須要填寫主要資料就好了。咱們打算把詳細信息設計爲子文檔存儲。html
1) linq方式實現mongodb
1. 新建數據描述類,描述用戶信息數據庫
01 |
/// <summary> |
02 |
/// 用戶主要資料 |
03 |
/// </summary> |
04 |
public class UserInfo |
05 |
{ |
06 |
public string UserId { get ; set ; } |
07 |
public string UserName { get ; set ; } |
08 |
public string PassWord { get ; set ; } |
09 |
public Detail Detail { get ; set ; } |
10 |
} |
11 |
12 |
/// <summary> |
13 |
/// 用戶詳細資料 |
14 |
/// </summary> |
15 |
public class Detail |
16 |
{ |
17 |
public string Address { get ; set ; } |
18 |
public int Age { get ; set ; } |
19 |
public string Email { get ; set ; } |
20 |
} |
2. 咱們要新建一個用戶業務操做類「UserBLL」。這個時候要讓驅動知道UserInfo類描述了「用戶資料」的字段信息,在GetMongo()方法實現了配置步驟,UserBLL完整代碼以下:app
01 |
public class UserBLL |
02 |
{ |
03 |
public string connectionString = "mongodb://localhost" ; |
04 |
public string databaseName = "myDatabase" ; |
05 |
06 |
private Mongo mongo; |
07 |
private MongoDatabase mongoDatabase; |
08 |
09 |
//注意這裏泛型類型爲「UserInfo」 |
10 |
private MongoCollection<UserInfo> mongoCollection; |
11 |
12 |
public UserBLL() |
13 |
{ |
14 |
mongo = GetMongo(); |
15 |
mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase; |
16 |
mongoCollection = mongoDatabase.GetCollection<UserInfo>() as MongoCollection<UserInfo>; |
17 |
mongo.Connect(); |
18 |
} |
19 |
~UserBLL() |
20 |
{ |
21 |
mongo.Disconnect(); |
22 |
} |
23 |
24 |
/// <summary> |
25 |
/// 配置Mongo,將類UserInfo映射到集合 |
26 |
/// </summary> |
27 |
private Mongo GetMongo() |
28 |
{ |
29 |
var config = new MongoConfigurationBuilder(); |
30 |
config.Mapping(mapping => |
31 |
{ |
32 |
mapping.DefaultProfile(profile => |
33 |
{ |
34 |
profile.SubClassesAre(t => t.IsSubclassOf( typeof (UserInfo))); |
35 |
}); |
36 |
mapping.Map<UserInfo>(); |
37 |
}); |
38 |
config.ConnectionString(connectionString); |
39 |
return new Mongo(config.BuildConfiguration()); |
40 |
} |
41 |
} |
3. 接着,在「UserBLL」類中定義一個方法「InsertSomeData()」來插入一些數據:網站
01 |
/// <summary> |
02 |
/// 插入一些數據 |
03 |
/// </summary> |
04 |
public void InsertSomeData() |
05 |
{ |
06 |
UserInfo userInfo1 = new UserInfo() |
07 |
{ |
08 |
UserId = "1001" , |
09 |
UserName = "張三" , |
10 |
PassWord = "123456" |
11 |
}; |
12 |
mongoCollection.Save(userInfo1); |
13 |
14 |
UserInfo userInfo2 = new UserInfo() |
15 |
{ |
16 |
UserId = "1002" , |
17 |
UserName = "李四" , |
18 |
PassWord = "123456" , |
19 |
Detail = new Detail() |
20 |
{ |
21 |
Address = "湖北" , |
22 |
Age = 20, |
23 |
Email = "lisi@163.com" |
24 |
} |
25 |
}; |
26 |
mongoCollection.Save(userInfo2); |
27 |
28 |
UserInfo userInfo3 = new UserInfo() |
29 |
{ |
30 |
UserId = "1003" , |
31 |
UserName = "王五" , |
32 |
PassWord = "123456" , |
33 |
Detail = new Detail() |
34 |
{ |
35 |
Address = "廣東" , |
36 |
Age = 20, |
37 |
Email = "wangwu@163.com" |
38 |
} |
39 |
}; |
40 |
mongoCollection.Save(userInfo3); |
41 |
42 |
UserInfo userInfo4 = new UserInfo() |
43 |
{ |
44 |
UserId = "1004" , |
45 |
UserName = "趙六" , |
46 |
PassWord = "123456" , |
47 |
Detail = new Detail() |
48 |
{ |
49 |
Address = "湖北" |
50 |
} |
51 |
}; |
52 |
mongoCollection.Save(userInfo4); |
53 |
54 |
} |
4. 定義一個查找數據的方法「Select」,它將查找用戶詳細信息中,地址在湖北的所有用戶:ui
1 |
/// <summary> |
2 |
/// 查詢詳細資料地址爲湖北的用戶信息 |
3 |
/// </summary> |
4 |
public List<UserInfo> Select() |
5 |
{ |
6 |
return mongoCollection.Linq().Where(x => x.Detail.Address == "湖北" ).ToList(); |
7 |
} |
5. 還定義一個刪除數據的方法,將刪除集合所有數據:spa
1 |
/// <summary> |
2 |
/// 刪除所有用戶信息 |
3 |
/// </summary> |
4 |
public void DeleteAll() |
5 |
{ |
6 |
mongoCollection.Remove(x => true ); |
7 |
} |
6. 在Main方法中添加以下代碼:設計
01 |
static void Main( string [] args) |
02 |
{ |
03 |
04 |
UserBLL userBll = new UserBLL(); |
05 |
userBll.InsertSomeData(); |
06 |
var users = userBll.Select(); |
07 |
foreach (var user in users) |
08 |
{ |
09 |
Console.WriteLine(user.UserName + "是湖北人" ); |
10 |
}; |
11 |
userBll.DeleteAll(); |
12 |
} |
7. 最後執行程序,打印以下信息:code
李四是湖北人 |
趙六是湖北人 |
1) 普通實現htm
普通方式實現不想多講,直接貼代碼,看看與linq方式有什麼區別:
001 |
class Program |
002 |
{ |
003 |
static void Main( string [] args) |
004 |
{ |
005 |
UserBLL userBll = new UserBLL(); |
006 |
userBll.InsertSomeData(); |
007 |
var users = userBll.Select(); |
008 |
foreach (var user in users) |
009 |
{ |
010 |
Console.WriteLine(user[ "UserName" ].ToString() + "是湖北人" ); |
011 |
}; |
012 |
userBll.DeleteAll(); |
013 |
014 |
Console.ReadLine(); |
015 |
} |
016 |
} |
017 |
018 |
public class UserBLL |
019 |
{ |
020 |
public string connectionString = "mongodb://localhost" ; |
021 |
public string databaseName = "myDatabase" ; |
022 |
public string collectionName = "UserInfo" ; |
023 |
024 |
private Mongo mongo; |
025 |
private MongoDatabase mongoDatabase; |
026 |
private MongoCollection<Document> mongoCollection; |
027 |
028 |
public UserBLL() |
029 |
{ |
030 |
mongo = new Mongo(connectionString); |
031 |
mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase; |
032 |
mongoCollection = mongoDatabase.GetCollection<Document>(collectionName) as MongoCollection<Document>; |
033 |
mongo.Connect(); |
034 |
} |
035 |
~UserBLL() |
036 |
{ |
037 |
mongo.Disconnect(); |
038 |
} |
039 |
040 |
/// <summary> |
041 |
/// 插入一些數據 |
042 |
/// </summary> |
043 |
public void InsertSomeData() |
044 |
{ |
045 |
Document userInfo1 = new Document(); |
046 |
userInfo1[ "UserId" ] = "1001" ; |
047 |
userInfo1[ "UserName" ] = "張三" ; |
048 |
userInfo1[ "PassWord" ] = "123456" ; |
049 |
mongoCollection.Save(userInfo1); |
050 |
051 |
Document userInfo2 = new Document(); |
052 |
userInfo2[ "UserId" ] = "1002" ; |
053 |
userInfo2[ "UserName" ] = "李四" ; |
054 |
userInfo2[ "PassWord" ] = "123456" ; |
055 |
//子文檔 |
056 |
var userInfo2Detail = new Document(); |
057 |
userInfo2Detail[ "Address" ] = "湖北" ; |
058 |
userInfo2Detail[ "Age" ] = 20; |
059 |
userInfo2Detail[ "Email" ] = "lisi@163.com" ; |
060 |
userInfo2[ "Detail" ] = userInfo2Detail; |
061 |
mongoCollection.Save(userInfo2); |
062 |
063 |
Document userInfo3 = new Document(); |
064 |
userInfo3[ "UserId" ] = "1003" ; |
065 |
userInfo3[ "UserName" ] = "王五" ; |
066 |
userInfo3[ "PassWord" ] = "123456" ; |
067 |
var userInfo3Detail = new Document(); |
068 |
userInfo3Detail[ "Address" ] = "廣東" ; |
069 |
userInfo3Detail[ "Age" ] = 20; |
070 |
userInfo3Detail[ "Email" ] = "wangwu@163.com" ; |
071 |
userInfo3[ "Detail" ] = userInfo3Detail; |
072 |
mongoCollection.Save(userInfo3); |
073 |
074 |
Document userInfo4 = new Document(); |
075 |
userInfo4[ "UserId" ] = "1004" ; |
076 |
userInfo4[ "UserName" ] = "趙六" ; |
077 |
userInfo4[ "PassWord" ] = "123456" ; |
078 |
var userInfo4Detail = new Document(); |
079 |
userInfo4Detail[ "Address" ] = "湖北" ; |
080 |
userInfo4[ "Detail" ] = userInfo4Detail; |
081 |
mongoCollection.Save(userInfo4); |
082 |
083 |
} |
084 |
085 |
/// <summary> |
086 |
/// 查詢詳細資料地址爲湖北的用戶信息 |
087 |
/// </summary> |
088 |
public IEnumerable<Document> Select() |
089 |
{ |
090 |
return mongoCollection.Find( new Document { { "Detail.Address" , "湖北" } }).Documents; |
091 |
} |
092 |
093 |
/// <summary> |
094 |
/// 刪除所有用戶信息 |
095 |
/// </summary> |
096 |
public void DeleteAll() |
097 |
{ |
098 |
mongoCollection.Remove( new Document { }); |
099 |
} |
100 |
101 |
} |
最後,咱們經過這段代碼輸出所有用戶資料信息的BJSON格式:
01 |
/// <summary> |
02 |
/// 打印數據BJSON |
03 |
/// </summary> |
04 |
public void PrintBJSON() |
05 |
{ |
06 |
string BJSON = string .Empty; |
07 |
foreach (var documet in mongoCollection.FindAll().Documents) |
08 |
{ |
09 |
10 |
BJSON += documet.ToString(); |
11 |
12 |
} |
13 |
Console.WriteLine(BJSON); |
14 |
} |
結果以下:
1 |
{ "UserId" : "1001" , "UserName" : "張三" , "PassWord" : "123456" , "_id" : "4d80ec1ab8a4731338000001" } |
2 |
{ "UserId" : "1002" , "UserName" : "李四" , "PassWord" : "123456" , "Detail" : { "Address" : "湖北" , "Age" : 20, "Email" : "lisi@163.com" }, "_id" : "4d80ec1ab8a4731338000002" } |
3 |
{ "UserId" : "1003" , "UserName" : "王五" , "PassWord" : "123456" , "Detail" : { "Address" : "廣東" , "Age" : 20, "Email" : "wangwu@163.com" }, "_id" : "4d80ec1ab8a4731338000003" } |
4 |
{ "UserId" : "1004" , "UserName" : "趙六" , "PassWord" : "123456" , "Detail" : { "Address" : "湖北" }, "_id" : "4d80ec1ab8a4731338000004" } |
一樣舉個例子:有一個學校人事管理系統要統計班級和學生的信息,如今定義了一個「班級集合」,這個集合裏面的學生字段是一個「學生集合」,包含了本班所有學生。
1) linq方式實現
基礎配置我就很少說了,數據類定義以下:
01 |
/// <summary> |
02 |
/// 班級信息 |
03 |
/// </summary> |
04 |
public class ClassInfo |
05 |
{ |
06 |
public string ClassName { get ; set ; } |
07 |
public List<Student> Students { get ; set ; } |
08 |
} |
09 |
10 |
/// <summary> |
11 |
/// 學生信息 |
12 |
/// </summary> |
13 |
public class Student |
14 |
{ |
15 |
public string Name { get ; set ; } |
16 |
public int Age { get ; set ; } |
17 |
} |
查詢叫「張三」的學生在哪一個班級,以及他的詳細信息:
(這裏實際上是ToList後在內存中查的,linq方式直接查詢好像驅動不支持。)
1 |
public List<ClassInfo> Select() |
2 |
{ |
3 |
return mongoCollection.Linq().ToList().Where(x => x.Students.Exists(s => s.Name == "張三" )).ToList(); |
4 |
} |
1) 普通實現
查詢叫「張三」的學生在哪一個班級,以及他的詳細信息:
1 |
public List<Document> Select() |
2 |
{ |
3 |
var mongocollection = mongoDatabase.GetCollection( "ClassInfo" ); |
4 |
return mongocollection.Find( new Document { { "Students.Name" , "張三" } }).Documents.ToList(); |
5 |
} |
打印數據的BJSON:
1 |
{ "_id" : "4d814bae5c5f000000005f63" , "ClassName" : "1001" , "Students" : [ { "Name" : "張三" , "Age" : 10 }, { "Name" : "李四" , "Age" : 0 } ] } |
2 |
{ "_id" : "4d814bae5c5f000000005f64" , "ClassName" : "1002" , "Students" : [ ] } |
3 |
{ "_id" : "4d814bae5c5f000000005f65" , "ClassName" : "1003" , "Students" : [ { "Name" : "王五" , "Age" : 11 }, { "Name" : "趙六" , "Age" : 9 } ] } |
經過本節例子咱們發現,MongoDB有它獨特的文檔結構能夠描述數據對象之間的一些關係特徵。它雖然沒有關係型數據庫多表符合查詢那樣強大的表間查詢方式,但也能夠經過文檔結構描述更靈活的關係特性,能夠這麼說,關係型數據庫能作的,MongoDB基本上也能夠作到。甚至有些關係數據庫不容易作到的,MongoDB也能夠輕鬆作到,好比,描述數據類的繼承關係等。