您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關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。
打開瀏覽器輸入: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,<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
下載地址:http://www.mongovue.com/downloads/
運行效果如下:
八,在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)查詢數據
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();
}
十,寫個批處理,方便開啟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了。
上述就是小編為大家分享的MongoDB的本質及怎么進行安裝配置了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。