簡(jiǎn)介
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)瘫析。由C++語(yǔ)言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB是一個(gè)高性能熙兔,開源悲伶,無模式的文檔型數(shù)據(jù)庫(kù),是當(dāng)前NoSql數(shù)據(jù)庫(kù)中比較熱門的一種住涉。
MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品麸锉,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的舆声。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散花沉,是類似json的bjson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型媳握。Mongo最大的特點(diǎn)是他支持的查詢語(yǔ)言非常強(qiáng)大碱屁,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能毙芜,而且還支持對(duì)數(shù)據(jù)建立索引忽媒。
傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)一般由數(shù)據(jù)庫(kù)(database)、表(table)腋粥、記錄(record)三個(gè)層次概念組成晦雨,MongoDB是由數(shù)據(jù)庫(kù)(database)、集合(collection)隘冲、文檔對(duì)象(document)三個(gè)層次組成闹瞧。MongoDB對(duì)于關(guān)系型數(shù)據(jù)庫(kù)里的表,但是集合中沒有列展辞、行和關(guān)系概念奥邮,這體現(xiàn)了模式自由的特點(diǎn)。
特點(diǎn)
它的特點(diǎn)是高性能罗珍、易部署洽腺、易使用,存儲(chǔ)數(shù)據(jù)非常方便覆旱。主要功能特性有:
- 面向集合存儲(chǔ)蘸朋,易存儲(chǔ)對(duì)象類型的數(shù)據(jù)。
- 模式自由扣唱。
- 支持動(dòng)態(tài)查詢藕坯。
- 支持完全索引,包含內(nèi)部對(duì)象噪沙。
- 支持查詢炼彪。
- 支持復(fù)制和故障恢復(fù)。
- 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ)正歼,包括大型對(duì)象(如視頻等)辐马。
- 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性局义。
- 支持RUBY喜爷,PYTHON膜楷,JAVA,C++贞奋,PHP,C#等多種語(yǔ)言。
- 文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展)穷绵。
- 可通過網(wǎng)絡(luò)訪問轿塔。
在C#中使用官方驅(qū)動(dòng)操作MongoDB
先用官方提供的CSharpDriver-1.7.0.4714.zip
MongoDB.Driver.dll:顧名思義,驅(qū)動(dòng)程序
MongoDB.Bson.dll:序列化仲墨、Json相關(guān)
然后在我們的程序中引用這兩個(gè)dll勾缭。
下載安裝和開啟服務(wù)器
下載地址:http://www.mongodb.org/downloads。提供了各種平臺(tái)的版本目养。我這里選擇的是Windows平臺(tái)下的俩由。
新建目錄E:\ mongodb , 將下載的壓縮包解壓到此目錄。bin文件夾下有一堆.exe 文件
其中有兩個(gè)最重要的文件:Mongod.exe和Mongo.exe 癌蚁。
Mongod.exe 是用來連接到mongo數(shù)據(jù)庫(kù)服務(wù)器的幻梯,即服務(wù)器端。
**Mongo.exe **是用來啟動(dòng)MongoDB shell的努释,即客戶端碘梢。
其他文件:
mongodump 邏輯備份工具。
mongorestore 邏輯恢復(fù)工具伐蒂。
mongoexport 數(shù)據(jù)導(dǎo)出工具煞躬。
mongoimport 數(shù)據(jù)導(dǎo)入工具。
開啟服務(wù)器
第一步:新建一個(gè)目錄用來存放MongoDB的數(shù)據(jù)庫(kù)文件逸邦,即dbpath恩沛。隨便建在那都可以,我這里建在 E:\MongoDBFiles缕减。 這是為了下一步使用的雷客。
第二步:打開CMD窗口,鍵入如下命令
e:
cd E:\mongodb\mongodb-win32-x86_64-3.0.6\bin
mongod.exe -dbpath "E:\mongodbfiles"
最后一行命令中的-dbpath 參數(shù)值就是我們第一步新建的文件夾烛卧。這個(gè)文件夾一定要在開啟服務(wù)之前事先建立好佛纫,否則會(huì)報(bào)錯(cuò),mongodb不會(huì)自己創(chuàng)建总放。
如果操作成功會(huì)出現(xiàn)如下界面:
該界面該我們展示了一些信息:如進(jìn)程ID是7620呈宇,端口號(hào)是27017。
打開瀏覽器輸入:http://127.0.0.1:27017/
我們看到了這樣的提示:
“You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number”
到此局雄,MongoDB數(shù)據(jù)庫(kù)服務(wù)已經(jīng)成功啟動(dòng)了甥啄。
使用mongo.exe 執(zhí)行數(shù)據(jù)庫(kù)增刪改查操作
mongodb 為我們提供的客戶端管理工具是mongo.exe
-
創(chuàng)建數(shù)據(jù)庫(kù):
雙擊打開mongo.exe 出現(xiàn)如下界面:
該界面的意思是,當(dāng)前連接的數(shù)據(jù)庫(kù)是test炬搭,這是系統(tǒng)默認(rèn)將要?jiǎng)?chuàng)建的蜈漓。為什么說是“將要?jiǎng)?chuàng)建的”呢穆桂?因?yàn)榇藭r(shí)并不存在此數(shù)據(jù)庫(kù),或者說它現(xiàn)在還只在內(nèi)存中融虽,并沒有創(chuàng)建在物理磁盤上享完。不信,你看MongoDBFiles文件夾下面除了mongod.lock外有额,什么都沒有般又。只有當(dāng)你執(zhí)行了插入數(shù)據(jù)的命令后,該數(shù)據(jù)庫(kù)才會(huì)真正的創(chuàng)建巍佑。
好了茴迁,我們暫時(shí)不管這個(gè)test了。現(xiàn)在我們來創(chuàng)建一個(gè)叫RdfDb的數(shù)據(jù)庫(kù)萤衰。
在shell 命令窗口鍵入如下命令:
use RdfDb // use 命令用來切換當(dāng)前數(shù)據(jù)庫(kù)堕义,如果該數(shù)據(jù)庫(kù)不存在,則會(huì)先新建一個(gè)脆栋。
-
創(chuàng)建collection并插入數(shù)據(jù)
在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中倦卖,創(chuàng)建完了庫(kù)后接下來會(huì)創(chuàng)建表,但是在mongoDB中沒有“表”的概念椿争,與其對(duì)應(yīng)的一個(gè)概念是集合糖耸,即collection。
在shell 命令窗口鍵入如下命令:
> db.users.insert({'name':'Bobby','sex':'man'})
// 這條命令是向users 集合中插入一條數(shù)據(jù)丘薛。
如果集合users不存在嘉竟,則會(huì)先新建一個(gè),然后再插入數(shù)據(jù)洋侨,參數(shù)以JSON格式傳入舍扰。
因?yàn)槲覀兒竺嬉獪y(cè)試刪除數(shù)據(jù),所以我們?cè)俨迦胍粭l數(shù)據(jù):
> db.users.insert({'name':'Samba','sex':'man'})
在上面我們創(chuàng)建了數(shù)據(jù)庫(kù)希坚,創(chuàng)建了集合边苹,還插入了兩條數(shù)據(jù),那么這些操作有沒有執(zhí)行成功呢裁僧?我們來查詢一下:
在shell 命令窗口鍵入如下命令:
> show dbs // 顯示所有數(shù)據(jù)庫(kù)
> show collections // 顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有集合
> db.users.find() // 顯示users集合下的所有數(shù)據(jù)文檔
shell 界面如下:
看我用紅色標(biāo)記的部分个束。這說明我們之前的操作是成功的。我們還看到系統(tǒng)**給每條記錄分配了一個(gè)惟一主鍵 _id **聊疲。
-
更新數(shù)據(jù)
現(xiàn)在我們要把第二條數(shù)據(jù)的sex改成女即“women”
在shell 命令窗口鍵入如下命令:
> db.users.update({'name':'Samba'},{'$set':{'sex':'women'}},upsert=true,multi=false)
解釋一下幾個(gè)參數(shù):
第一:查詢的條件
第二:更新的字段
第三:如果不存在則插入
第四:是否允許修改多條記錄
-
刪除記錄
我們現(xiàn)在要把第一條記錄即'name'為'Bobby'的刪除
在shell 命令窗口鍵入如下命令:
> db.users.remove({'name':'Bobby'})
我們?cè)跈z驗(yàn)一下兩步有沒有操作成功茬底,在shell 命令窗口鍵入如下命令:
> db.users.find()
從輸出的界面我們看到現(xiàn)在只剩下一條'name'為'Samba'的了,并且它的'sex'為'women'获洲,這說明兩步操作成功了阱表。
- 刪除collection
> db.users.drop() //如果刪除成功會(huì)返回“true”,否則返回“false”
- 刪除當(dāng)前數(shù)據(jù)庫(kù)
> db.dropDatabase()
Tdf.MongoDB
https://www.nuget.org/packages/Tdf.MongoDB/
基于MongoDB官方發(fā)布的C#驅(qū)動(dòng),封裝對(duì)MongoDB數(shù)據(jù)庫(kù)的增刪改查訪問方法最爬;
Features
The full list of extension methods in Tdf.MongoDB right now are:
將集合名稱寫到C#代碼中作為字符串常量 CollectionNames.cs
public class CollectionNames
{
public const string User = "User";
public const string Role = "Role";
}
編寫實(shí)體類 User.cs
public class User : EntityBase
{
public string UserName { get; set; }
public int Age { get; set; }
public State State { get; set; }
}
其中涉馁,State枚舉類定義如下: State.cs
public enum State
{
/// <summary>
/// 正常
/// </summary>
Normal = 1,
/// <summary>
/// 未使用
/// </summary>
Unused = 2,
}
在配置文件中編寫數(shù)據(jù)庫(kù)連接串和數(shù)據(jù)庫(kù)名稱 App.config
<appSettings>
<!--MongoDB數(shù)據(jù)庫(kù)連接串-->
<add key="MongoDBConn" value="mongodb://127.0.0.1:27017"/>
<!--MongoDB數(shù)據(jù)庫(kù)名稱-->
<add key="MongoDBName" value="RdfDb"/>
</appSettings>
Get methods
static void QueryTest()
{
var queryBuilder = new QueryBuilder<User>();
var query = queryBuilder.GTE(x => x.Age, 27);
var ltModel = MongoDbHelper.GetManyByCondition<User>(DbConfigParams.ConntionString, DbConfigParams.DbName,
CollectionNames.User, query);
if (ltModel != null && ltModel.Count > 0)
{
foreach (var item in ltModel)
{
Console.WriteLine("姓名:{0},年齡:{1}爱致,狀態(tài):{2}",
item.UserName, item.Age, GetStateDesc(item.State));
}
}
}
/// <summary>
/// 獲取狀態(tài)描述
/// </summary>
/// <param name="state">狀態(tài)</param>
/// <returns>狀態(tài)描述</returns>
static string GetStateDesc(State state)
{
string result = string.Empty;
switch (state)
{
case State.Normal:
result = "正常";
break;
case State.Unused:
result = "未使用";
break;
default:
throw new ArgumentOutOfRangeException("state");
}
return result;
}
Insert methods
static void InsertTest()
{
var random = new Random();
for (var i = 1; i <= 10; i++)
{
var item = new User()
{
UserName = "我的名字" + i,
Age = random.Next(25, 30),
State = i % 2 == 0 ? State.Normal : State.Unused
};
MongoDbHelper.Insert(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.User, item);
}
}
Update methods
static void UpdateTest()
{
var queryBuilder = new QueryBuilder<User>();
var query = queryBuilder.GTE(x => x.Age, 27);
var dictUpdate = new Dictionary<string, BsonValue>();
dictUpdate["State"] = State.Unused;
MongoDbHelper.Update(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.User, query,
dictUpdate);
}
Delete methods
static void DeleteTest()
{
var queryBuilder = new QueryBuilder<User>();
var query = queryBuilder.GTE(x => x.Age, 28);
MongoDbHelper.DeleteByCondition(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.User, query);
}
給Mongodb設(shè)置密碼
mongod --dbpath 存放數(shù)據(jù)庫(kù)文件夾路徑
打開命令行窗口輸入mongo烤送,進(jìn)入mongo環(huán)境
切換到 'admin' 數(shù)據(jù)庫(kù) use admin
給admin設(shè)置用戶密碼:
user: 用戶名, pwd: 用戶密碼,roles: 用來設(shè)置用戶的權(quán)限,比如讀糠悯,讀寫 等等
db.createUser({user: 'root', pwd: '123456', roles: ['root']})
驗(yàn)證是否添加成功胯努,'db.auth(用戶名,用戶密碼)' 這里用db.auth('root', '123456') 如果返回 '1'表示驗(yàn)證成功逢防, 如果是 '0' 表示驗(yàn)證失敗...
切換到RdfLogDb數(shù)據(jù)庫(kù),use RdfLogDb
接下來為這個(gè)庫(kù)添加一個(gè)用戶蒲讯,并且賦予權(quán)限忘朝,
db.createUser({user:'rdf',pwd:'rdfcore',roles: [{role:'readWrite',db:'RdfLogDb'}]})})
OK,一切搞定判帮,重新開機(jī)mongodb局嘁,MongoDB默認(rèn)是沒有開啟訪問控制,我們通過--auth參數(shù)重啟mongod服務(wù)晦墙。mongod --dbpath 存放數(shù)據(jù)庫(kù)文件夾路徑 --auth一旦開啟了悦昵,用戶連接mongod必須指定用戶名和密碼。
mongod --dbpath C:\mongodb --auth