1. 程式人生 > >MongoDB開發學習經典入門

MongoDB開發學習經典入門

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

閱讀目錄

一:簡介

二:特點

一,簡介

   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,下載地址:http://www.mongodb.org/downloads。提供了各種平臺的版本。我這裡選擇的是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。

我們看到了這樣的提示:

“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,<optional params>)
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

執行效果如下:

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

 8.1)下載安裝

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

下載地址:http://github.com/mongodb/mongo-csharp-driver/downloads

編譯之後得到兩個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>(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)查詢資料

複製程式碼
//引用
//using MongoDB.Driver.Builders;
//using MongoDB.Bson;
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 query = Query.EQ("Name", "xumingxiang");    // 等於
        //類似的還有:
        query = Query.NE("Name", "xumingxiang");     //不等於
        query = Query.GT("Age", 25);                 //大於
        query = Query.GTE("Age", 25);                //大於等於
        query = Query.LT("Age", 25);                 //小於
        query = Query.LTE("Age", 25);                //小於等於

        //子查詢
        query = Query.In("Age", new List<BsonInt32> { 25, 26, 27 });        //查詢Age的值在25、26、27範圍內的資料   
        query = Query.NotIn("Age", new List<BsonInt32> { 25, 26, 27 });     //查詢Age的值不在25、26、27範圍內的資料   

        //And 操作
        query = Query.And( Query.GT("Age",20),Query.LT("Sex","") );

        //Or 操作
        query = Query.Or(Query.GT("Age", 20), Query.LT("Sex", ""));


        query = Query.Exists("BirthDay");       //存在 名為 BirthDay 的欄位的資料
        query = Query.NotExists("BirthDay");    //不存在 名為 BirthDay 的欄位的資料

        query = Query.Mod("Age", 10, 1);        //查詢age取模10等於1的資料
            

    var sort = SortBy.Ascending("Age");             //順序排列
    sort = SortBy.Descending("Age");                //倒序排列

    //上面這寫程式碼你可能更喜歡寫成泛型的形式,那樣會更符合您的編碼哲學,該驅動也是支援的,如:
    var  tQuery = Query<Users>.In(x => x.Age, new List<BsonInt32> { 25, 26, 27 });   
    var  tSort = SortBy<Users>.Descending(x=>x.Age);


    //查詢全部集合裡的資料
    var result1 = col.FindAllAs<Users>().ToList();

    //查詢第一條資料,查詢條件可預設。
    var result2 = col.FindOneAs<Users>();
    //查詢指定查詢條件的全部資料
    var result3 = col.FindAs<Users>(query)  //篩選條件
        .SetSortOrder(sort)             //排序
        .Distinct()                     //排重
        .Skip(20)                       //跳過前20個
        .Take(10)                       //取後面的10個 
        .ToList();



}