MongoDB是一個著名的NoSQL數據庫,顧名思義就是不使用SQL的數據庫,目前在不少場景都有使用。若是你不喜歡使用笨拙的各類SQL數據庫,能夠嘗試使用一下MongoDB,會有不同的感覺。本文就是一篇簡單的Windows下的安裝和使用教程。html
首先,先到MongoDB官網下載頁下載社區版的服務器,因爲這裏是Windows系統,因此固然下載Windows版本的。注意咱們要下載的是社區版,而不是導航條第一個的Atlas。如你所見,MongoDB官網是一個商業化的網站,Atlas正是它提供的一個商業版服務,可讓咱們鏈接到他們的服務器。python
具體版本默認第一個就能夠了,功能最全,帶有SSL支持。注意三個版本都是64位的,因此32位的操做系統沒法運行。下載完成以後安裝便可,大約150M左右的安裝包,很快就能夠安裝完畢。git
對於我來講,我將其安裝到了D:\Program Files\MongoDB
。等到安裝完成,打開D:\Program Files\MongoDB\Server\3.4\bin
就會發現MongoDB的一系列程序,主要用到的就是mongo.exe
(客戶端)和mongod.exe
(服務端)。爲了使用方便,最好把這個路徑添加到環境變量中,之後就能夠直接在終端中使用這些命令了。首先要作的事情固然是啓動服務端。在終端直接執行mongod
命令便可。github
mongod
而後你就會發現如圖所示的錯誤。mongodb
固然具體錯誤圖裏面說的很清楚了,沒有數據文件夾。默認Windows版本,會在你安裝盤符下尋找data/db
文件夾做爲數據文件夾,個人D盤上天然沒有,因此會出現錯誤。解決辦法很簡單,在命令上添加--dbpath
參數便可。shell
mongod --dbpath d:\test\mongodb\data
固然還可使用配置文件。配置文件名字能夠隨便起,可是格式必須是YAML格式的。例如我但願讓可執行文件目錄下的data
文件夾做爲數據文件夾,而且對於每一個單獨的數據庫都有本身的目錄,就能夠這麼配置(別忘了建立對應文件夾)。關於配置文件的詳細文檔能夠參考官方Configuration File Options。數據庫
storage: dbPath: data directoryPerDB: true
配置完成後,使用-f
或者--config
參數來指定配置文件。編程
mongod --config /etc/mongod.conf mongod -f /etc/mongod.conf
這樣,MongoDB服務器就能夠成功啓動了。windows
每次啓動都要輸入命令很麻煩,MongoDB提供了註冊爲Windows服務的功能。原本一開始我是用的winsw來註冊服務的,而後發現MongoDB官方就帶了這個功能。因此來介紹一下。api
其實很簡單,打開上面介紹的配置文件,而後添加下面一節內容,具體名稱本身修改。這裏用戶名和密碼不是必須的。這裏日誌設置是必須的,否則會提示沒法安裝Windows服務。
storage: dbPath: 'D:\Program Files\MongoDB\Server\3.4\data' directoryPerDB: true processManagement: windowsService: serviceName: MongoDB displayName: MongoDB description: MongoDB serviceUser: <string> servicePassword: <string> systemLog: destination: file path: 'D:\Program Files\MongoDB\Server\3.4\mongod.log'
而後在運行服務端的時候添加--install
參數,並且這裏的配置文件路徑必須使用絕對路徑。別忘了使用管理員權限的cmd或者Powershell來運行。
mongod -f 'D:\Program Files\MongoDB\Server\3.4\config.yaml' --install
安裝以後的服務默認是開機自啓的,不過沒有啓動,因此還須要咱們手動啓動。手動在服務中啓動,或者在管理員權限的Powershell中執行下面的命令。
Start-Service MongoDB
若是沒有修改端口號等配置的話,能夠直接鏈接。
PS C:\WINDOWS\system32> mongo MongoDB shell version v3.4.10 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.10 Server has startup warnings: 2017-11-20T04:48:38.134+0800 I CONTROL [initandlisten] 2017-11-20T04:48:38.134+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-11-20T04:48:38.134+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-11-20T04:48:38.135+0800 I CONTROL [initandlisten] >
因爲我正好有一個Dedicenter的服務器,因此順便來試試Linux下安裝。Linux下安裝其實也很簡單,使用對應的包管理器能夠比較方便的安裝和啓動。例如個人服務器是CentOS 7的系統,因此使用yum包管理器來安裝軟件。下面的命令同時安裝了客戶端和服務器端。
$ sudo yum install mongodb-server mongodb
固然我安裝完了以後發現了一個問題,那就是CentOS自帶的MongoDB版本比較低,如今的版本是3.4,而自帶的版本是2.6.因此仍是須要本身安裝最新版的。具體方法須要搜索。對於CentOS 來講,首先須要建立社區源的文件/etc/yum.repos.d/mongodb-org-3.4.repo
,內容以下。
[mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
而後安裝mongodb-org
軟件包,會包括客戶端、服務端、shell工具等四個軟件包。
$ sudo yum install mongodb-org
若是對應的系統還啓用了SELinux,那麼還須要作一些額外工做,這些工做就須要查看官方文檔Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux了。個人服務器沒有SELinux功能,因此不須要這額外的步驟了。
Linux下,MongoDB的數據文件在/var/lib/mongo
下,日誌文件在/var/log/mongodb
下,這些都不須要更改。若是有須要的話,別忘了設置對應的權限。
首先須要編輯一下配置文件/etc/mongod.conf
。先來設置一下監聽IP,因爲這是個人服務器,我但願能夠在外網訪問數據庫,因此把IP這一行註釋掉,或者修改爲0.0.0.0
。其他配置按需求更改。
net: port: 27017 # bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.
而後啓動服務端。
sudo systemctl enable mongod sudo systemctl start mongod
而後輸入mongo
命令來鏈接。若是是鏈接其餘主機的服務器,須要使用額外的參數。
mongo -host XXX.XX.XXX.XXX -port 27017
在前面咱們一直都沒有設置用戶名和密碼,這可能致使安全問題,登陸客戶端的時候也同時給了警告。因此咱們第一件事情就是設置用戶名和密碼。這部分能夠參考官方文檔Enable Auth。
首先先以默認方式登陸,而後切換到管理員數據庫並新建管理員用戶。
use admin db.createUser( { user: "admin", pwd: "12345678", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
而後在重啓服務端的時候同時添加--auth
參數,或者在配置文件中設置。
security: authorization: enabled
服務器啓用驗證以後,客戶端在登陸的時候也須要驗證。能夠在啓動的時候經過參數來驗證。
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
或者先以無權限方式登陸,而後在進行驗證。
use admin db.auth("myUserAdmin", "abc123" )
固然,實際狀況中咱們確定不會使用管理員去登陸通常數據庫(實際上MongoDB也不容許,管理員只有建立用戶和角色的權限),因此還須要建立一個普通用戶進行訪問。在你使用的數據庫中建立一個用戶,並賦予合適的權限便可。登陸方式基本同上,只不過驗證數據庫改一下就行。
use test db.createUser( { user: "myTester", pwd: "xyz123", roles: [ { role: "readWrite", db: "test" }, { role: "read", db: "reporting" } ] } )
固然,若是是開發和測試,創建一個萬能的管理員用戶更加省時。
use admin db.createUser( { user: "superuser", pwd: "12345678", roles: [ "root" ] } )
先來講說MongoDB的增刪查改。這一部分的官方文檔是MongoDB CRUD Operations,這一塊的文檔作的很是好,還配有Web控制檯能夠鏈接到它的示例數據庫,因此咱們能夠一邊閱讀文檔一邊測試命令,很是方便。
首先先選定一個數據庫,若是該數據庫不存在,會建立這個數據庫。
use hello
先來看看插入操做,主要有如下兩個方法,分別用於一次性插入一個或多個數據。若是集合不存在,會首先建立這個集合。
下面是一個簡單的例子。插入的數據相似JSON格式。
> db.user.insertOne({id:1,name:'yitian',age:24}) { "acknowledged" : true, "insertedId" : ObjectId("5a12bc37f8fe60078d1a24fe") } > db.user.insertOne({id:2,name:'zhang3',age:25}) { "acknowledged" : true, "insertedId" : ObjectId("5a12bc93f8fe60078d1a24ff") }
若是要使用insertMany
插入多個數據,須要使用[]
來傳遞一個數組。這是官方文檔的例子。
db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } }, { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } }, { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } } ])
首先準備一些示例數據。
db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" } ]);
若是要查詢全部數據,直接傳遞一個空對象。
db.inventory.find( {} )
若是用具體的條件來查詢,直接傳遞具體的鍵值對{ <field1>: <value1>, ... }
便可。
db.inventory.find( { status: "D" } )
若是使用條件查詢的話,須要傳遞查詢屬性、運算符以及查詢條件{ <field1>: { <operator1>: <value1> }, ... }
。
# 查詢stauts是A或D的 db.inventory.find( { status: { $in: [ "A", "D" ] } } ) # 查詢status是A,且qty小於30的 db.inventory.find( { status: "A", qty: { $lt: 30 } } ) # 查詢status是A或qyt小於30的 db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) # 更復雜的查詢 db.inventory.find( { status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] } )
更新操做主要使用如下三個函數,用於更新一個、多個或者替換數據。<filter>
就是切面介紹的查詢條件,其他的將在下面介紹。
db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <replacement>, <options>)
先來看看更新一個數據,須要用到$set
操做符,用來設置新屬性。$currentDate
操做符用於設置最後修改時間,若是lastModified
屬性不存在,就會添加這個屬性並設置爲當前時間。
db.inventory.updateOne( { item: "paper" }, { $set: { "size.uom": "cm", status: "P" }, $currentDate: { lastModified: true } } )
相似的,是更新多條數據。
db.inventory.updateMany( { "qty": { $lt: 50 } }, { $set: { "size.uom": "in", status: "P" }, $currentDate: { lastModified: true } } )
最後是替換數據。
db.inventory.replaceOne( { item: "paper" }, { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] } )
最後來講說<option>
。目前這個選項只有一個upsert : true
,若是設置爲true,那麼若是沒有查詢到相應的數據,會將更新的數據做爲新數據插入到數據庫中。
刪除數據相對來講很簡單,語法和前面基本相似。因此直接來看李子壩。
首先是刪除全部數據。
db.inventory.deleteMany({})
刪除符合條件的全部數據。
db.inventory.deleteMany({ status : "A" })
刪除單條數據。
db.inventory.deleteOne( { status: "D" } )
官方文檔MongoDB CRUD Operations作的很不錯的一點就是包含了多種語言的範例,基本上支持瞭如今全部的主流語言。
官方推薦使用PyMongo庫來操做MongoDB。首先須要安裝。文檔能夠參考PyMongo 3.5.1 Documentation。
pip install PyMongo
簡單的增刪查改例子以下。
from pymongo import MongoClient from pprint import pprint # 鏈接數據庫 client = MongoClient('localhost', 27017) # 選擇數據庫 db = client['hello'] # 獲取集合 user = db.user # 插入數據 user.insert_one({"_id": 1, "name": "yitian", "age": 24}) user.insert_one({"_id": 2, "name": "zhang3", "age": 25}) user.insert_one({"_id": 3, "name": "li4", "age": 26}) # 更新數據 user.update_one({"_id": 1}, {"$set": {"name": "易天"}}) user.update_many({}, {"$inc": {"age": 1}}) # 查詢數據 yitian = user.find_one({"name": "yitian"}) yitian = user.find_one({"_id": 1}) pprint(yitian) print("------全部數據--------") for u in user.find(): pprint(u) print("------年齡大於25的--------") for u in user.find({"age": {"$gt": 25}}): pprint(u) # 刪除全部數據 user.remove({})
C#和Kotlin是我最喜歡的兩門語言。因此順便來看看如何用C#訪問MongoDB。對應的官網文檔是MongoDB .NET Driver。
首先須要安裝NuGet包,若是使用Visual Studio的話很是簡單,右鍵點擊項目,選擇管理安裝的NuGet包,而後搜索並安裝MongoDB便可。下面是個簡單的例子。
public static void Sample() { var client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("hello"); var user = db.GetCollection<BsonDocument>("user"); user.InsertOne(new BsonDocument { { "name", "yitian" }, { "_id", 1 }, { "age", 25 } }); user.InsertOne(new BsonDocument { { "name", "li4" }, { "_id", 3 }, { "age", 24 } }); Console.WriteLine("查詢單條數據"); var filter = Builders<BsonDocument>.Filter.Eq("_id", 1); Console.WriteLine( user.Find(filter).First() ); Console.WriteLine("更新用戶姓名"); user.FindOneAndUpdate(filter, Builders<BsonDocument>.Update.Set("name", "易天")); Console.WriteLine("條件查詢大於25的"); filter = Builders<BsonDocument>.Filter.Gte("age", 25); user.Find(filter).ToList().ForEach(e => Console.WriteLine(e)); Console.WriteLine("全部數據"); user.Find(new BsonDocument()).ToList().ForEach(e => Console.WriteLine(e)); user.DeleteMany(new BsonDocument()); }
最後來介紹一下幾個圖形客戶端,方便咱們對數據進行可視化處理。
第一個就是MongoDB官方的圖形客戶端Compass,用起來還能夠。
第二個叫MongoBooster,是一個MongoDB的IDE,智能提示和補全比較方便,同時支持流式API方便查詢。
第三個是Robo 3T,原名叫作Robomongo,是一個輕量級圖形客戶端。若是但願更多功能,還能夠下載使用Studio 3T,一個智能IDE。
最後說一下我對MongoDB的感覺。它是一個比較輕量級的NoSQL數據庫,存儲序列化的數據很合適,可是多表查詢功能比較弱,要想作到SQL數據庫那種複雜的多表查詢比較困難。可是若是是我的小項目的話,仍是很是推薦使用的,用起來心理做用上比SQL數據庫的逼格仍是要高一些的。