閱讀93 返回首頁    go 技術社區[雲棲]


MongoDB開發學習(1)開天辟地,經典入門

一,簡介

   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,下載地址:https://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。

打開瀏覽器輸入:https://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,<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

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

運行效果如下:

 

 

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

 8.1)下載安裝

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

下載地址:https://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)查詢數據

複製代碼
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<Users>();
    //查詢指定查詢條件的第一條數據,查詢條件可缺省。
 var result2 = col.FindOneAs<Users>();
    //查詢指定查詢條件的全部數據
 var result3 = col.FindAs<Users>(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;

/// <summary>
/// 打開數據庫鏈接
/// </summary>
public void GetConnection()
{
    //定義Mongo服務
 Mongo mongo = new Mongo(strconn);
    //打開連接
 mongo.Connect();
    //獲得數據庫cnblogs,若不存在則自動創建
 db = mongo.GetDatabase(dbName) as MongoDatabase;
}

/// <summary>
/// 添加數據
/// </summary>
public void Insert()
{
    var col = db.GetCollection<Users>();
    //或者 
    //var col = db.GetCollection("Users");

    Users users = new Users();
    users.Name = "xumingxiang";
    users.Sex = "man";
    col.Insert(users);
}
/// <summary>
/// 更新數據
/// </summary>
public void Update()
{
    var col = db.GetCollection<Users>();
    //查出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");
}

/// <summary>
/// 刪除數據
/// </summary>
public void Delete()
{
    var col = db.GetCollection<Users>();
    col.Remove(x => x.Sex == "man");
    ////或者
    ////查出Name值為xumingxiang的第一條記錄
 //Users users = col.FindOne(x => x.Sex == "man");
    //col.Remove(users);
}

/// <summary>
/// 查詢數據
/// </summary>
public void Query()
{
    var col = db.GetCollection<Users>();
    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了。

 

原文地址:https://www.cnblogs.com/xumingxiang/archive/2012/04/08/2437468.html

最後更新:2017-04-02 16:48:14

  上一篇:go ubuntu 64位 無法安裝android SDK解決辦法
  下一篇:go MySQL與MongoDB的操作對比