安裝和使用MongoDB

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

註冊爲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]
>

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

若是對應的系統還啓用了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

官方文檔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數據庫的逼格仍是要高一些的。

相關文章
相關標籤/搜索