1. 程式人生 > >安裝和使用MongoDB

安裝和使用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

資料夾作為資料資料夾,我的D盤上自然沒有,所以會出現錯誤。解決辦法很簡單,在命令上新增--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