安裝和使用MongoDB
MongoDB是一個著名的NoSQL資料庫,顧名思義就是不使用SQL的資料庫,目前在很多場景都有使用。如果你不喜歡使用笨拙的各種SQL資料庫,可以嘗試使用一下MongoDB,會有不一樣的感受。本文就是一篇簡單的Windows下的安裝和使用教程。
下載和安裝
首先,先到MongoDB官網下載頁下載社群版的伺服器,由於這裡是Windows系統,所以當然下載Windows版本的。注意我們要下載的是社群版,而不是導航條第一個的Atlas。如你所見,MongoDB官網是一個商業化的網站,Atlas正是它提供的一個商業版服務,可以讓我們連線到他們的伺服器。
具體版本預設第一個就可以了,功能最全,帶有SSL支援。注意三個版本都是64位的,所以32位的作業系統無法執行。下載完成之後安裝即可,大約150M左右的安裝包,很快就可以安裝完畢。
配置和啟動
對於我來說,我將其安裝到了D:\Program Files\MongoDB
。等到安裝完成,開啟D:\Program Files\MongoDB\Server\3.4\bin
就會發現MongoDB的一系列程式,主要用到的就是mongo.exe
(客戶端)和mongod.exe
(服務端)。為了使用方便,最好把這個路徑新增到環境變數中,以後就可以直接在終端中使用這些命令了。首先要做的事情當然是啟動服務端。在終端直接執行mongod
命令即可。
mongod
- 1
然後你就會發現如圖所示的錯誤。
當然具體錯誤圖裡面說的很清楚了,沒有資料資料夾。預設Windows版本,會在你安裝碟符下尋找data/db
--dbpath
引數即可。
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官方就帶了這個功能。所以來介紹一下。
其實很簡單,開啟上面介紹的配置檔案,然後新增下面一節內容,具體名稱自己修改。這裡使用者名稱和密碼不是必須的。這裡日誌設定是必須的,不然會提示無法安裝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]
>
Linux下安裝和配置
安裝
由於我正好有一個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
配置並啟動
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
先來看看插入操作,主要有以下兩個方法,分別用於一次性插入一個或多個數據。如果集合不存在,會首先建立這個集合。
- db.collection.insertOne()
下面是一個簡單的例子。插入的資料類似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(, , )
- db.collection.updateMany(, , )
- db.collection.replaceOne(, , )
先來看看更新一個數據,需要用到$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
官方文件MongoDB CRUD Operations做的很不錯的一點就是包含了多種語言的範例,基本上支援了現在所有的主流語言。
使用Python
官方推薦使用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
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());
}
圖形客戶端
最後來介紹一下幾個圖形客戶端,方便我們對資料進行視覺化處理。
Compass
第一個就是MongoDB官方的圖形客戶端Compass,用起來還可以。
MongoBooster
第二個叫MongoBooster,是一個MongoDB的IDE,智慧提示和補全比較方便,同時支援流式API方便查詢。
Robo 3T
第三個是Robo 3T,原名叫做Robomongo,是一個輕量級圖形客戶端。如果希望更多功能,還可以下載使用Studio 3T,一個智慧IDE。
最後說一下我對MongoDB的感受。它是一個比較輕量級的NoSQL資料庫,儲存序列化的資料很合適,但是多表查詢功能比較弱,要想做到SQL資料庫那種複雜的多表查詢比較困難。但是如果是個人小專案的話,還是非常推薦使用的,用起來心理作用上比SQL資料庫的逼格還是要高一些的。
掃碼向博主提問
過了即是客
非學,無以致疑;非問,無以廣識
- 擅長領域:
- java
--------------------- 本文來自 過了即是客 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u011054333/article/details/78588396?utm_source=copy