一、前言
現在越來越多的公司開始采用非關系數據庫了,並且很多公司的面試都要求面試者有MongoDB的使用經驗,至於非關系數據庫與關系型數據庫之間的區別大家可以自行百度。但是作為程序員的我們,既然大部分公司都需要有NOSQL的使用經驗,自然我們就應該學習起來了。所以也就有了這個系列了。NOSQL包括很多,但是使用最大的還是屬於MongoDB和Redis。所以在本系列中將詳細介紹下這兩種非關系數據庫的環境搭建和一些常規使用。本專題就首先介紹下MongoDB開發環境的搭建和完成一些簡單的增刪改查操作。下面就隨着我一起去學習吧。
二、MongoDB開發環境搭建
MongoDB的開發環境的搭建相對來說還是很簡單的,盡管說MongoDB是非關系數據庫,但是和關系型數據(如SQL Server)一樣,都是用來持久化數據的。自然和非關系型數據目的是一樣的,其開發方式也是非常類似的。大家都知道,在對SQL Server進行操作時,需要搭建一個SQL Server服務器,然后用.NET的相關技術充當客戶端來對SQL Server服務器進行操作,來完成對數據的持久化保存操作。所以,對於MongDB的開發模式也是一樣的,只是它們之間持久化的數據格式不一樣而已。SQL Server等關系型數據庫都是以表來保存數據的,而MongoDB等非關系型數據庫都是以JSON格式來保存數據的。
既然,它們的開發模式是一樣的,在之前我們對SQL Server操作都是首先需要連接SQL Server服務器,然后本地開發需要引入SQL Server驅動來進行開發。所以MongoDB的開發環境的搭建也不例外。
首先,我們需要去MongoDB下載MongoDB。下載地址:https://www.mongodb.org/downloads。由於,我的操作系統是32位的,所以我這里下載的版本就是32位3.0.4版本。下載下來后,然后進行解壓。
其實,到這里,MongoDB的開發環境就完成了。這里大家肯定會問,不會吧,這么快,以前SQL Server安裝程序可是要安裝很久的啊,怎么MongoDB這么快就好?此時大家千萬不要疑惑,此時開發環境真的已經大家好了。下面就讓我們看看如何通過來完成對MongoDB的增刪改查操作。
三、基本操作
首先,打開命令行工具,然后切換到你MongoDB所在的目錄。通過允許mongod.exe程序來啟動MongoDB服務器,同時還需要用--dbpath參數來指定數據存放的文件夾。如果不指定參數將不能成功啟動MongoDB服務,具體的命令如下圖所示:
通過上圖可以看到,我們的MongoDB服務已經啟動成功了,MongoDB默認監聽的端口就是27017。下面就通過瀏覽器來驗證下MongoDB服務是否啟動成功了。輸入地址:http://localhost:27017/。打開后,如果看到如下圖所示的結果,就表明MongoDB服務已經啟動成功了。
既然,MongoDB服務已經啟動了,接下來就需要客戶端對服務器進行請求來完成把數據保存到服務器上。我們同樣可以通過命令行的方式來啟動MongoDB的客戶端,重新打開一個命令行工具,通過mongo.exe命令來啟動MongoDB的客戶端。具體命令如下圖所示:
從上圖可以看到,客戶端默認鏈接的是"test"數據庫,就如SQL Server默認鏈接的是master數據庫一樣。既然,我們客戶端和服務器都已經准備好了,接下來就需要在客戶端通過命令來發出對服務器的請求,來完成增刪改查操作。
數據庫我們已經有了,即"test"數據庫,按照常規的數據庫操作,我們需要創建一個表,然后往表里插入一條數據。但是在非關系數據庫中,並沒有表的概念,只有集合的概念,大家可以把非關系數據庫中集合的概念理解為關系數據庫中表的一個概念。並且在MongoDB中並不需要單獨的創建集合命令,因為在插入的數據的同時也會完成集合的創建。這里把需要創建的集合命名為"person"。通過insert()方法來完成數據的插入。具體的命令如下圖所示:
通過上面可以看出,我們已經成功像person集合插入了2條記錄。可以通過find()方法來查詢下集合person中是否現在已經存在2條記錄。具體的查找命令如下圖所示:
從圖中可以發現,我們確實已經成功插入了2條記錄了,並且MongoDB服務已經自動為其加入_id這個字段,該字段的值也是由MongoDB服務默認為我們生成的GUID,來保證數據的唯一性。除此之外,我們還可以指定特定的篩選條件來篩選記錄。具體命令如下圖所示:
接下來,我們可以通過update()和remove()方法來完成數據的刪除和更新。具體的命令和效果如下圖所示:
update方法的第一個參數為“查詢條件”,第二個參數為“更新的值”。remove方法如果不帶參數將刪除所有數據。帶參數指的是“查詢條件”,即刪除掉查詢到的數據。
通過上面,我們就完成了MongoDB的增刪改查操作了。上面,我們是通過命令行的方式來完成的,但是這樣的方式未免有些不方便,此時就想:有沒有什么GUI的工具來完成這些操作呢?就如SQL Server的客戶端那樣。對於這點,答案是肯定的,這里我用的是“MongoVUE 1.5.3”版本,個人覺得還是蠻還用的,大家可以去百度雲盤去下載破解版的。下面讓我們通過MongoDB客戶端的GUI工具來查詢下剛才我們插入的數據,打開“MongoVUE”工具,然后點Connect按鈕來創建鏈接,連接就如下圖所示:
鏈接成功之后,我們就可以看到類似SQL Server那樣的數據庫結構界面了,具體的效果如下圖所示:
並且通過GUI客戶端工具可以很方便地完成增刪改查操作,而不需要手敲命令去完成。
四、通過C#來操作MongoDB
上面已經介紹了通過命令行和客戶端GUI工具來完成對MongoDB的操作,但是實際開發過程中,我們用的更多還是通過代碼來完成數據的持久化。下面就簡單介紹下,如果通過C#語言來完成對MongoDB的增刪改查操作。
同樣,我們用C#來操作MongoDB,一樣也需要啟動MongoDB服務器,只有服務啟動了,我們才能對其操作,說白了我們的程序就是充當一個客戶端,然后通過C#語言來發送命令讓MongoDB服務器執行相應的增刪改查操作,但是之前MongoDB服務宿主在控制台中的,這樣的宿主方式太過於麻煩了。因為每次服務重啟之后,還需要手動通過命令行方式來啟動服務。然而服務一般都是讓其自啟動的。所以MongoDB服務也可以宿主支持宿主在Windows服務中。首先,以管理員權限啟動命令行,然后輸入如下命令來將MongoDB宿主在Windows服務中:
mongod --dbpath=F:\Study\No-Sql\MongoDB\data --logpath=F:\Study\No-Sql\MongoDB\log\mongolog.txt --port 2322 --install.
具體的運行效果如下圖所示:
從上圖可以看出,我們還可以通過--remove命令來移除服務,並且在指定logpath和dbpath參數的時候必須指定為絕對路徑,否則會出現錯誤,並且指定logpath參數的值時,文件名必須要指定,如果文件在指定目錄下存在的話會報出警告說文件名已存在,已將日志移動另外一個日志文件下了,但是這不影響,服務依然可以安裝成功。關於mongod.exe的更多命令可以通過 mongod /help來查看。創建成功后,你將在Windows服務列表將查看到。然后進行啟動即可。這樣每次服務重啟就不需要手動去執行命令行了,服務會指定重啟。
下面我們還是回到正題。在使用C#操作MongoDB服務器之前,我們還需要下載對應的驅動程序,這樣才能通過C#來訪問到服務器,這里通過Nuget來下載官方的“MongoDB.Driver”驅動,下載完成之后,就可以用C#代碼來調用驅動中的API來操作mongoDB。其操作代碼基本與命令行的方式差不多,這里就不一一解釋了,大家可以自行看下面的代碼和參考命令行來進行理解。具體的代碼如下所示:
using System.Collections.Generic; using System.Threading.Tasks; using MongoDB.Bson; using MongoDB.Driver; namespace MongodbDemo { class Program { static void Main(string[] args) { var mongodbHelper =new MongodbHelper(); //var updateTask = mongodbHelper.Update(new Person() { Name = "LearninghardUpdate", Age = 25 }); //updateTask.Wait(); var taskAdd = mongodbHelper.Add(new Person() { Id = ObjectId.GenerateNewId().ToString(), Name = "Learninghard2", Age = 25 }); taskAdd.Wait(); foreach (var person in mongodbHelper.SelectAll()) { Console.WriteLine("Name: {0}, Age: {1}", person.Name, person.Age); } Console.Read(); } } public class MongodbHelper { private const string Conn = "mongodb://localhost:2322"; private const string DbName = "test"; private const string TbName = "person"; private readonly MongoClient client; private readonly IMongoDatabase dbDatabase; public MongodbHelper() { // 創建數據連接 client = new MongoClient(Conn); // 獲取指定數據庫 dbDatabase = client.GetDatabase(DbName); } public async Task Add(Person p) { // 獲取表 var collection = dbDatabase.GetCollection<Person>(TbName); // 插入 await collection.InsertOneAsync(p); } public async Task Delete(string name) { var collection = dbDatabase.GetCollection<Person>(TbName); var filter = Builders<Person>.Filter.Eq("Name", name); await collection.DeleteOneAsync(filter); } public async Task Update(Person p) { //獲取表 var col = dbDatabase.GetCollection<Person>(TbName); var filter = Builders<Person>.Filter.Eq("Age", p.Age); var update = Builders<Person>.Update.Set("Name", p.Name); await col.UpdateManyAsync(filter, update); } public Person SelectOne(string name) { var collection = dbDatabase.GetCollection<Person>(TbName); var filter = Builders<Person>.Filter.Eq("Name", name); var person = collection.Find(filter).FirstAsync().Result; return person; } public IEnumerable<Person> SelectAll() { var persons =new List<Person>(); var collection = dbDatabase.GetCollection<Person>(TbName); var result = collection.Find(p => true).ToListAsync(); result.Wait(); persons.AddRange(result.Result); return persons; } } public class Person { public string Id { get; set; } public string Name { get; set; } public int Age { get; set; } } }
具體的運行效果這里就不貼圖了,大家可以自行下載代碼進行運行查看。
五、總結
到此,本專題的內容就介紹結束,本專題只是簡單介紹了MongoDB開發環境的搭建和通過命令行和MongoDB GUI工具來對MongoDB進行操作,最后介紹了在實際開發環境中,通過C#來操作MongoDB以及將MongoDB宿主在Windows服務中。本專題只是一個開始,希望本專題可以使得大家對MongoD可以快速入門。接下來的專題將介紹MongoDB索引、集群和故障轉移的支持。
本專題所有源碼下載:http://files.cnblogs.com/files/zhili/MongoDBQuickStart.zip