[MongoDb技術]MongoDB開發學習?

如果你從來沒有接觸MongoDB或對MongoDB有一點了解,如果你是C#開發人員,那麼你不妨花幾分鐘看看本文。本文將一步一步帶您輕鬆入門。

閱讀目錄

一:簡介

二:特點

三:下載安裝和開啟伺服器

四:使用mongo.exe 執行資料庫增刪改查操作

五:更多命令

六:MongoDB語法與現有關係型資料庫SQL語法比較

七:視覺化的客戶端管理工具MongoVUE

八:在C#中使用官方驅動操作MongoDB

九,在C#中使用samus驅動操作MongoDB

十:寫個批處理,方便開啟Mongodb伺服器

一,簡介

  MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

  MongoDB是一個高效能,開源,無模式的文件型資料庫,是當前NoSql資料庫中比較熱門的一種。

MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,是類似json的bjson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

傳統的關係資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由資料庫(database)、集合(collection)、文件物件(document)三個層次組成。MongoDB對於關係型資料庫裡的表,但是集合中沒有列、行和關係概念,這體現了模式自由的特點。

二,特點

  它的特點是高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:

  1)面向集合儲存,易儲存物件型別的資料。

  2)模式自由。

  3)支援動態查詢。

  4)支援完全索引,包含內部物件。

  5)支援查詢。

  6)支援複製和故障恢復。

  7)使用高效的二進位制資料儲存,包括大型物件(如視訊等)。

  8)自動處理碎片,以支援雲端計算層次的擴充套件性。

  9)支援RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

  10)檔案儲存格式為BSON(一種JSON的擴充套件)。

  11)可通過網路訪問。

三,下載安裝和開啟伺服器

3.1)MongoDB 當前版本是2.0.4,下載地址:提供了各種平臺的版本。我這裡選擇的是Windows平臺下的。

3.2)新建目錄E:\ mongodb , 將下載的壓縮包解壓到此目錄。bin資料夾下有一堆.exe 檔案

其中有兩個最重要的檔案:Mongod.exe和Mongo.exe 。

Mongod.exe 是用來連線到mongo資料庫伺服器的,即伺服器端。

Mongo.exe 是用來啟動MongoDB shell的,即客戶端。

其他檔案:

mongodump 邏輯備份工具。

mongorestore 邏輯恢復工具。

mongoexport 資料匯出工具。

mongoimport 資料匯入工具。

3.3)開啟伺服器

第一步:新建一個目錄用來存放MongoDB的資料庫檔案,即dbpath。隨便建在那都可以,我這裡建在 E:\MongoDBFiles 。 這是為了下一步使用的。

第二步:開啟CMD視窗,鍵入如下命令

> e:

> cd e:\mongodb\mongodb-win32-i386-2.0.4\bin

> mongod.exe -dbpath "E:\mongodbfiles"

最後一行命令中的-dbpath 引數值就是我們第一步新建的資料夾。這個資料夾一定要在開啟服務之前事先建立好,否則會報錯,mongodb不會自己建立。

如果操作成功會出現如下介面:

該介面該我們展示了一些資訊:如程序ID是2988,埠號是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資料庫服務已經成功啟動了。

四,使用mongo.exe 執行資料庫增刪改查操作

mongodb 為我們提供的客戶端管理工具是mongo.exe

4.1)建立資料庫:

雙擊開啟mongo.exe 出現如下介面:

該介面的意思是,當前連線的資料庫是test,這是系統預設將要建立的。為什麼說是“將要建立的”呢?因為此時並不存在此資料庫,或者說它現在還只在記憶體中,並沒有建立在物理磁碟上。不信,你看MongoDBFiles資料夾下面除了mongod.lock外,什麼都沒有。只有當你執行了插入資料的命令後,該資料庫才會真正的建立。

好了,我們暫時不管這個test了。現在我們來建立一個叫cnblogs 的資料庫。

在shell 命令視窗鍵入如下命令:

> use cnblogs // use 命令用來切換當前資料庫,如果該資料庫不存在,則會先新建一個。

4.2)建立collection並插入資料

在傳統關係型資料庫中,建立完了庫後接下來會建立表,但是在mongoDB中沒有“表”的概念,與其對應的一個概念是集合,即collection。

在shell 命令視窗鍵入如下命令:

> db.users.insert({'name':'xumingxiang','sex':'man'})

// 這條命令是向users 集合中插入一條資料。如果集合users不存在,則會先新建一個,然後再插入資料,引數以JSON格式傳入。

因為我們後面要測試刪除資料,所以我們再插入一條資料:

> db.users.insert({'name':xiangshu','sex':'man'})

4.3)在上面4.1)和4.2)我們建立了資料庫,建立了集合,還插入了兩條資料,那麼這些操作有沒有執行成功呢?我們來查詢一下:

在shell 命令視窗鍵入如下命令:

> show dbs // 顯示所有資料庫

>show collections // 顯示當前資料庫下的所有集合

>db.users.find() // 顯示users集合下的所有資料文件

shell 介面如下:

看我用紅色標記的部分。這說明我們之前的操作是成功的。我們還看到系統給每條記錄分配了一個惟一主鍵 _id 。

4.4)更新資料

現在我們要把第二條資料的sex改成女即“women”

在shell 命令視窗鍵入如下命令:

> db.users.update({'name':'xiangshu'},{'$set':{'sex':'women'}},upsert=true,multi=false)

解釋一下幾個引數:

第一:查詢的條件

第二:更新的欄位

第三:如果不存在則插入

第四:是否允許修改多條記錄

4.5)刪除記錄

我們現在要把第一條記錄即'name'為'xumingxiang'的

在shell 命令視窗鍵入如下命令:

> db. users.remove({'name':'xumingxiang'})

我們在檢驗一下4)5)兩步有沒有操作成功,在shell 命令視窗鍵入如下命令:

> db.users.find()

從輸出的介面我們看到現在只剩下一條'name'為'xiangshu'的了,並且它的'sex'為'women',這說明4)5)兩步操作成功了。

4.6)刪除所有記錄

> db.users.remove()

4.7) 刪除collection

> db.users.drop() //如果刪除成功會返回“true”,否則返回“false”

4.8)刪除當前資料庫

> db.dropDatabase()

五,更多命令

db.AddUser(username,password) 新增使用者

db.auth(usrename,password) 設定資料庫連線驗證

db.cloneDataBase(fromhost) 從目標伺服器克隆一個數據庫

db.commandHelp(name) returns the help for the command

db.copyDatabase(fromdb,todb,fromhost) 複製資料庫fromdb---源資料庫名稱,todb---目標資料庫名稱,fromhost---源資料庫伺服器地址

db.createCollection(name,{size:3333,capped:333,max:88888}) 建立一個數據集,相當於一個表

db.currentOp() 取消當前庫的當前操作

db.dropDataBase() 刪除當前資料庫

db.eval(func,args) run code server-side

db.getCollection(cname) 取得一個數據集合,同用法:db['cname'] or

db.getCollenctionNames() 取得所有資料集合的名稱列表

db.getLastError() 返回最後一個錯誤的提示訊息

db.getLastErrorObj() 返回最後一個錯誤的物件

db.getMongo() 取得當前伺服器的連線物件get the server

db.getMondo().setSlaveOk() allow this connection to read from then nonmaster membr of a replica pair

db.getName() 返回當操作資料庫的名稱

db.getPrevError() 返回上一個錯誤物件

db.getProfilingLevel()

db.getReplicationInfo() 獲得重複的資料

db.getSisterDB(name) get the db at the same server as this onew

db.killOp() 停止(殺死)在當前庫的當前操作

db.printCollectionStats() 返回當前庫的資料集狀態

db.printReplicationInfo()

db.printSlaveReplicationInfo()

db.printShardingStatus() 返回當前資料庫是否為共享資料庫

db.removeUser(username) 刪除使用者

db.repairDatabase() 修復當前資料庫

db.resetError()

db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj:1}

db.setProfilingLevel(level) 0=off,1=slow,2=all

db.shutdownServer() 關閉當前服務程式

db.version() 返回當前程式的版本資訊

db.test.find({id:10}) 返回test資料集ID=10的資料集

db.test.find({id:10}).count() 返回test資料集ID=10的資料總數

db.test.find({id:10}).limit(2) 返回test資料集ID=10的資料集從第二條開始的資料集

db.test.find({id:10}).skip(8) 返回test資料集ID=10的資料集從0到第八條的資料集

db.test.find({id:10}).limit(2).skip(8) 返回test資料集ID=1=的資料集從第二條到第八條的資料

db.test.find({id:10}).sort() 返回test資料集ID=10的排序資料集

db.test.findOne([query]) 返回符合條件的一條資料

db.test.getDB() 返回此資料集所屬的資料庫名稱

db.test.getIndexes() 返回些資料集的索引資訊

db.test.group({key:...,initial:...,reduce:...[,cond:...]})

db.test.mapReduce(mayFunction,reduceFunction, )

db.test.remove(query) 在資料集中刪除一條資料

db.test.renameCollection(newName) 重新命名些資料集名稱

db.test.save(obj) 往資料集中插入一條資料

db.test.stats() 返回此資料集的狀態

db.test.storageSize() 返回此資料集的儲存大小

db.test.totalIndexSize() 返回此資料集的索引檔案大小

db.test.totalSize() 返回些資料集的總大小

db.test.update(query,object[,upsert_bool]) 在此資料集中更新一條資料

db.test.validate() 驗證此資料集

db.test.getShardVersion() 返回資料集共享版本號

六,MongoDB語法與現有關係型資料庫SQL語法比較

MongoDB語法 MySql語法

db.test.find({'name':'foobar'}) <==> select * from test where name='foobar'

db.test.find() <==> select * from test

db.test.find({'ID':10}).count() <==> select count(*) from test where ID=10

db.test.find().skip(10).limit(20) <==> select * from test limit 10,20

db.test.find({'ID':{$in:[25,35,45]}}) <==> select * from test where ID in (25,35,45)

db.test.find().sort({'ID':-1}) <==> select * from test order by ID desc

db.test.distinct('name',{'ID':{$lt:20}}) <==> select distinct(name) from test where ID<20

db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}}) <==> select name,sum(marks) from test group by name

db.test.find('this.ID<20',{name:1}) <==> select name from test where ID<20

db.test.insert({'name':'foobar','age':25})<==>insert into test ('name','age') values('foobar',25)

db.test.remove({}) <==> delete * from test

db.test.remove({'age':20}) <==> delete test where age=20

db.test.remove({'age':{$lt:20}}) <==> elete test where age<20

db.test.remove({'age':{$lte:20}}) <==> delete test where age<=20

db.test.remove({'age':{$gt:20}}) <==> delete test where age>20

db.test.remove({'age':{$gte:20}}) <==> delete test where age>=20

db.test.remove({'age':{$ne:20}}) <==> delete test where age!=20

db.test.update({'name':'foobar'},{$set:{'age':36}}) <==> update test set age=36 where name='foobar'

db.test.update({'name':'foobar'},{$inc:{'age':3}}) <==> update test set age=age+3 where name='foobar'

注意以上命令大小寫敏感

七,視覺化的客戶端管理工具MongoVUE

使用mongo.exe 管理資料庫雖然可行,功能也挺強大,但每次都要敲命令,即繁瑣枯燥而且效率低下。下面介紹一款Windows下的視覺化操作的管理工具MongoVUE

下載地址:http://www.mongovue.com/downloads/

執行效果如下:

八,在C#中使用官方驅動操作MongoDB

8.1)下載安裝

想要在C#中使用MongoDB,首先得要有個MongoDB支援的C#版的驅動。C#版的驅動有很多種,如官方提供的,samus。 實現思路大都類似。這裡我們先用官方提供的mongo-csharp-driver ,當前版本為1.4.1

下載地址:

編譯之後得到兩個dll

MongoDB.Driver.dll:顧名思義,驅動程式

MongoDB.Bson.dll:序列化、Json相關

然後在我們的程式中引用這兩個dll。

下面的部分簡單演示了怎樣使用C#對MongoDB進行增刪改查操作。

8.2)連線資料庫:

在連線資料庫之前請先確認您的MongoDB已經開啟了。

//資料庫連線字串

const string strconn = "mongodb://127.0.0.1:27017";

//資料庫名稱

const string dbName = "cnblogs";

//建立資料庫連結

MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);

//獲得資料庫cnblogs

MongoDatabase db = server.GetDatabase(dbName);

8.3)插入資料:

好了資料打開了,現在得新增資料了,我們要新增一條User“記錄”到 Users集合中。

在MongoDB中沒有表的概念,所以在插入資料之前不需要建立表。

但我們得定義好要插入的資料的模型Users

Users.cs:

public class Users

{

public ObjectId _id;//BsonType.ObjectId 這個對應了 MongoDB.Bson.ObjectId

    public string Name { get; set; }

public string Sex { set; get; }

}

_id 屬性必須要有,否則在更新資料時會報錯:“Element '_id' does not match any field or property of class”。

好,現在看看新增資料的程式碼怎麼寫:

public void Insert()

{

//建立資料庫連結

MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);

//獲得資料庫cnblogs

MongoDatabase db = server.GetDatabase(dbName);

Users users = new Users();

users.Name = "xumingxiang";

users.Sex = "man";

//獲得Users集合,如果資料庫中沒有,先新建一個

MongoCollection col = db.GetCollection("Users");

//執行插入操作

col.Insert (users);

}

8.4)更新資料

public void Update()

{

//建立資料庫連結

MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);

//獲得資料庫cnblogs

MongoDatabase db = server.GetDatabase(dbName);

//獲取Users集合

MongoCollection col = db.GetCollection("Users");

//定義獲取“Name”值為“xumingxiang”的查詢條件

var query = new QueryDocument { { "Name", "xumingxiang" } };

//定義更新文件

var update = new UpdateDocument { { "$set", new QueryDocument { { "Sex", "wowen" } } } };

//執行更新操作

col.Update(query, update);

}

8.5)刪除資料

public void Delete()

{

//建立資料庫連結

MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);

//獲得資料庫cnblogs

MongoDatabase db = server.GetDatabase(dbName);

//獲取Users集合

MongoCollection col = db.GetCollection("Users");

//定義獲取“Name”值為“xumingxiang”的查詢條件

var query = new QueryDocument { { "Name", "xumingxiang" } };

//執行刪除操作

col.Remove(query);

}

8.6)查詢資料

public void Query()

{

//建立資料庫連結

MongoServer server = MongoDB.Driver.MongoServer.Create(strconn);

//獲得資料庫cnblogs

MongoDatabase db = server.GetDatabase(dbName);

//獲取Users集合

MongoCollection col = db.GetCollection("Users");

//定義獲取“Name”值為“xumingxiang”的查詢條件

var query = new QueryDocument { { "Name", "xumingxiang" } };

//查詢全部集合裡的資料

var result1 = col.FindAllAs ();

//查詢指定查詢條件的第一條資料,查詢條件可預設。

var result2 = col.FindOneAs ();

//查詢指定查詢條件的全部資料

var result3 = col.FindAs (query);

}

九,在C#中使用samus驅動操作MongoDB

再來介紹一款第三方驅動samus,這是一款使用使用較多的驅動,更新頻率比較快,samus驅動除了支援一般形式的操作之外,還支援Linq 和Lambda 表示式。

下載地址:https://github.com/samus/mongodb-csharp

下載回來編譯得到兩個dll

MongoDB.dll 驅動的主要程式

MongoDB.GridFS.dll 用於儲存大檔案。

這裡我們引用MongoDB.dll 即可。關於MongoDB.GridFS.dll 本文用不到,暫不介紹,無視它。

其連線資料庫以及CRUD操作如下:

//資料庫連線字串

const string strconn = "mongodb://127.0.0.1:27017";

//資料庫名稱

const string dbName = "cnblogs";

//定義資料庫

MongoDatabase db;

///

/// 開啟資料庫連結

///

public void GetConnection()

{

//定義Mongo服務

Mongo mongo = new Mongo(strconn);

//開啟連線

mongo.Connect();

//獲得資料庫cnblogs,若不存在則自動建立

db = mongo.GetDatabase(dbName) as MongoDatabase;

}

///

/// 新增資料

///

public void Insert()

{

var col = db.GetCollection ();

//或者

//var col = db.GetCollection("Users");

Users users = new Users();

users.Name = "xumingxiang";

users.Sex = "man";

col.Insert(users);

}

///

/// 更新資料

///

public void Update()

{

var col = db.GetCollection ();

//查出Name值為xumingxiang的第一條記錄

Users users = col.FindOne(x => x.Name == "xumingxiang");

//或者

//Users users = col.FindOne(new Document { { "Name", "xumingxiang" } });

users.Sex = "women";

col.Update(users, x => x.Sex == "man");

}

///

/// 刪除資料

///

public void Delete()

{

var col = db.GetCollection ();

col.Remove(x => x.Sex == "man");

////或者

////查出Name值為xumingxiang的第一條記錄

//Users users = col.FindOne(x => x.Sex == "man");

//col.Remove(users);

}

///

/// 查詢資料

///

public void Query()

{

var col = db.GetCollection ();

var query = new Document { { "Name", "xumingxiang" } };

//查詢指定查詢條件的全部資料

var result1 = col.Find(query);

//查詢指定查詢條件的第一條資料

var result2 = col.FindOne(query);

//查詢全部集合裡的資料

var result3 = col.FindAll();

}

更多API有待各位同學自己體驗。

十,寫個批處理,方便開啟Mongodb伺服器

每次開啟Mongodb伺服器都要開啟CMD視窗,敲那麼一段命令,反反覆覆,你是不是也覺得煩呢?反正小弟本人厭惡敲dos命令,喜歡用滑鼠點點。

怎樣用滑鼠點一下就能開啟Mongodb伺服器呢?可能你已經想到了,寫個批處理程式不就搞定了嘛,是的,就是這樣,這個批處理很簡單。

全部程式碼如下:

@echo

@pause

mongod -repair -dbpath "E:\mongodbfiles"

mongod -dbpath "E:\mongodbfiles"

@pause

注:“mongod -repair -dbpath "E:\mongodbfiles"”是為了解決啟動時有時會報錯“Unclean shutdown detected mongodb”。

把它拷貝到記事本,儲存為.bat檔案,然後和mongod.exe放在同一個目錄,雙擊它就OK了。

相關問題答案