基于Mongodb進(jìn)行分布式數(shù)據(jù)存儲(chǔ)

簡(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ù)非常方便覆旱。主要功能特性有:

  1. 面向集合存儲(chǔ)蘸朋,易存儲(chǔ)對(duì)象類型的數(shù)據(jù)。
  2. 模式自由扣唱。
  3. 支持動(dòng)態(tài)查詢藕坯。
  4. 支持完全索引,包含內(nèi)部對(duì)象噪沙。
  5. 支持查詢炼彪。
  6. 支持復(fù)制和故障恢復(fù)。
  7. 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ)正歼,包括大型對(duì)象(如視頻等)辐马。
  8. 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性局义。
  9. 支持RUBY喜爷,PYTHON膜楷,JAVA,C++贞奋,PHP,C#等多種語(yǔ)言。
  10. 文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展)穷绵。
  11. 可通過網(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晌畅,一起剝皮案震驚了整個(gè)濱河市但指,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抗楔,老刑警劉巖棋凳,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異连躏,居然都是意外死亡剩岳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門入热,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍棕,“玉大人,你說我怎么就攤上這事勺良〈虏ィ” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵尚困,是天一觀的道長(zhǎng)幅垮。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么忙芒? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任示弓,我火速辦了婚禮,結(jié)果婚禮上呵萨,老公的妹妹穿的比我還像新娘奏属。我一直安慰自己,他們只是感情好潮峦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布囱皿。 她就那樣靜靜地躺著,像睡著了一般忱嘹。 火紅的嫁衣襯著肌膚如雪嘱腥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天拘悦,我揣著相機(jī)與錄音齿兔,去河邊找鬼。 笑死础米,一個(gè)胖子當(dāng)著我的面吹牛分苇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屁桑,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼医寿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蘑斧?” 一聲冷哼從身側(cè)響起靖秩,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竖瘾,沒想到半個(gè)月后盆偿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡准浴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年事扭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐横。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡求橄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葡公,到底是詐尸還是另有隱情罐农,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布催什,位于F島的核電站涵亏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜气筋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一拆内、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宠默,春花似錦麸恍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瓤球,卻和暖如春融欧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卦羡。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工噪馏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虹茶。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像隅要,于是被迫代替她去往敵國(guó)和親蝴罪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容