1. 程式人生 > 實用技巧 >MongoDB一篇從入門到實戰

MongoDB一篇從入門到實戰

MongoDB資料庫介紹

1、簡介

MongoDB官網:https://www.mongodb.com

  • MongoDB 是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統
  • MongoDB 可在高負載的情況下,新增更多的節點,可以保證伺服器效能
  • MongoDB 可為Web應用提供可擴充套件高效能資料儲存解決方案。
  • MongoDB 將資料儲存在靈活的json文件中,這意味著可以直接得到從文件到文件的資料、結構等。
  • MongoDB 是免費使用的(MongoDB分 社群版 [在所有環境下都免費] 和 企業版[在開發環境免費,生產環境收費] 兩個版本)
  • MongoDB 資料庫具有可伸縮性
    靈活性,可幫助你快速查詢索引你需要資料。

MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。

它是可擴充套件的高效能資料儲存解決方案,經常被用於非關係型資料的儲存,能儲存海量的資料。

常見的非關係型資料庫還有:Redis,但 MongoDb 比 redis 更具有資料庫的特性。

  • 關係型資料庫有:MySQL、Oracle、SQL Serve.....

  • 非關係型資料庫有:Redis、MongoDB...

對比

傳統的關係型資料庫(如 MySQL)儲存資料使用的是一種“行/列模型”。而 MongoDB 是一種“文件資料庫”,它將資料儲存在類似 JSON 的文件中。

以 JSON 文件的方式儲存資料,其中的好處有很多。比如,支援使用陣列和物件作為值、文件間可以巢狀、查詢的本身就是一個 JSON 等。

2、基本資料結構

與 MySQL 等關係型資料庫一樣,MongoDb 也有類似的概念,但是其稱呼不同。下表列出了 MongoDb 的基本資料結構以及與 MySQL 的對比。

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 資料庫
table collection 資料庫表/集合
row document 資料記錄行/文件
column field 資料欄位/域
index index 索引
table joins 表連線,MongoDb不支援
primary key primary key 主鍵,MongoDb自動將_id欄位設定為主鍵

MongoDB下載與安裝

1、Win10安裝

官網下載 地址:https://www.mongodb.com/try/download/community

其他下載方式:除了上面的下載方式以外,也可以試試下面的下載連結!

1、下載指定版本

  • MongoDB Enterprise Server:企業版(收費版)
  • MongoDB Community Server:社群版(免費版)(我們下載社群版本)
  • 下載完成後,獲得安裝包:mongodb-windows-x86_64-4.4.2-signed.msi,雙擊即可安裝。

2、選擇安裝方式:

  • 如果已經安裝過該版本的MongoDB,會是這個介面(如果沒有安裝過忽略此步驟)

  • 選擇Complete,表示安裝到預設路徑(不推薦,C盤懂的都懂)

  • 選擇Custom,表示自定義安裝路徑(推薦)

3、選擇安裝路徑:

注意:MongoDB 3.x 系列版本的資料庫,在安裝成功後,每次在使用前都需要手動啟動MongoDB服務!

現在:MongoDB 4.x 系列版本的資料庫,在安裝時預設安裝(選中了 Install MongoD as a Service)服務 ,就是在開機時自動啟動 MongoDB 服務,然後就可以直接使用啦!

4、然後就一直下一步、Next 直到 Flnish 安裝完畢,到此就MongoDB就安裝結束啦!

5、檢查是否安裝成功(Windows環境下)

  • 方式一:
1、執行 Win + R
2、輸入 services.msc 命令便可以檢視到 MongoDB Server (MongoDB) 服務啦!!
  • 方式二:
1、開啟任意瀏覽器輸入:http://127.0.0.1:27017/
2、返回如下資訊代表安裝成功:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
  • 方式三:
C:\Users\lenovo>mongod -version
db version v4.4.2
Build Info: {
    "version": "4.4.2",
    "gitVersion": "15e73dc5738d2278b688f8929aee605fe4279b0e",
    "modules": [],
    "allocator": "tcmalloc",
    "environment": {
        "distmod": "windows",
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

6、目錄檔案說明:

預設配置檔案:bin/mongod.cfg

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: D:\Environment\MongoDB\Server\4.4\data # 資料儲存目錄
  journal:
    enabled: true


# where to write logging data.
systemLog:
  destination: file
  logAppend: true # 日誌採用追加模式
  path:  D:\Environment\MongoDB\Server\4.4\log\mongod.log # 日誌檔案地址

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1 # 資料庫埠號
  

# 開啟資料庫訪問許可權驗證(注意:換行、縮排格式哦!!)
security: 
  authorization: enabled

7、配置環境變數(選配,看個人喜好,為了使用方便我配置了)

配置完畢後就是在電腦中任何地方都可以合用mongo、mongod等命令

8、mongod.exe 和 mongo.exe 命令

一定要以管理員身份啟動CMD!一定要以管理員身份啟動CMD!一定要以管理員身份啟動CMD!

這兩個命令的作用分別是:

  • mongod 啟動 MongoDB 伺服器。
  • mongo 在啟動伺服器後,幫助我們連線到 MongoDB 例項,也就是進入 Mongo shell(相當於讓我們進入後臺操作資料庫)。

mongod 命令啟動引數:

引數 描述
--config或-f 指定配置檔案路徑
--bind_ip 繫結服務IP,若繫結127.0.0.1,則只能本機訪問,不指定預設本地所有IP(0.0.0.0)
--dbpath 指定資料庫路徑
--logpath 定MongoDB日誌檔案,注意是指定檔案不是目錄
--logappend 使用追加的方式寫日誌
--port 指定服務埠號,預設埠27017
--serviceName 指定服務名稱
--serviceDisplayName 指定服務名稱,有多個mongodb服務時執行。
--install 指定作為一個Windows服務安裝。
--remove 移除MongoDB服務
--auth 表示載入認證功能

mongod 命令安裝示例:

######################## MongoDB方式建立win服務:########################
# 安裝 MongoDB 服務,指定配置檔案安裝(沒有指定服務名的話預設服務名為:MongoDB)
mongod --config "D:\Environment\MongoDB\Server\4.4\bin\mongod.cfg" --install
# 或者
mongod --bind_ip 0.0.0.0 --dbpath "D:\Environment\MongoDB\Server\4.4\data\db" --logpath "D:\Environment\MongoDB\Server\4.4\log\mongod.log" --logappend --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install

# 啟動和關閉 MongoDB 服務,該名稱位--serviceName設定的名稱
net start MongoDB
net stop MongoDB

# 移除 MongoDB 服務,必須先關閉 MongoDB 服務
mongod --remove


######################## windows自帶建立win服務方式:########################
# 建立 MongoDB 服務(中間幾個引號很關鍵)
sc.exe create MongoDB binPath= "\"D:\Environment\MongoDB\bin\mongod.exe\" --service --config= \"E:\Environment\MongoDB\mongo.config"" DisplayName= "MongoDB" start= "auto"

# 刪除 MongoDB 服務
sc delete MongoDB

mongo命令:進入 MongoDB Shell介面(登入)

# 1、mongo # 直接進入
# 2、mongo 127.0.0.1:27017/config # 連線到任何資料庫config
# 3、mongo --nodb #不連線到任何資料庫
# 4、啟動之後,在需要時執行new Mongo(hostname)命令就可以連線到想要的mongod了:
> conn=new Mongo('127.0.0.1:27017')
connection to 127.0.0.1:27017
> db=conn.getDB('admin')
admin
# 4、help檢視幫助


# mongo -u admin -p password # 連線本地資料庫,使用了--auth啟動,輸入賬號密碼
# 連線運程MongoDB資料庫:(必須指定 繫結IP 和 埠號)
# 格式:mongo 繫結IP:埠號/資料庫名 -u 使用者名稱 -p 密碼
mongo 127.0.0.1:27017/test -u admin -p password
或者
mongo --host 127.0.0.1 --port 27017

# 也可以登入shell後輸入使用者名稱和密碼登入
db.auth("admin", "password")

2、Linux安裝

3、Docker安裝

賬戶及許可權配置

注意:安裝好MongoDB資料庫後,預設是【非授權模式】(也就是不需要任何許可權驗證、不需要驗證賬戶,直接在命令視窗中輸入 mongo 回車,就可以進行相關操作),這是非常不安全的(特別是在生產環境中!)

所以:為了資料的安全,我們都應該去配置資料庫的訪問許可權 和 修改預設(mongodb://127.0.0.1:27017)連線繫結IP 和 埠號!!

1、建立超級管理員使用者

#1、進入mongo shell介面
mongo
#2、切換admin資料庫
use admin
#3、新增管理員使用者,其中,user 和 pwd 都分別代表使用者名稱和密碼,而 role 代表角色,db 代表要設定的資料庫。
db.createUser({user:"admin", pwd:"password",roles: [{role: "root", db: "admin" }]}) 
db.createUser({
    user: "admin",
    pwd: "password",
    roles: [{role: "root", db: "admin" }]
})
#4、刪除當前庫admin使用者
db.dropUser("admin")  

示例:

> use admin # 切換到admin資料庫
switched to db admin
> # 建立admin使用者
> db.createUser({user:"admin", pwd:"password",roles: [{role: "root", db: "admin" }]})
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
> show users # 查詢當前資料庫的所有使用者資訊
{
        "_id" : "admin.admin",
        "userId" : UUID("8150988b-5c3b-4885-ba70-a4fdaf237da6"),
        "user" : "admin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}
> db.dropUser("admin") # 刪除admin使用者
true
  • MongoDB資料庫賬戶配置常用命令:
# 登入認證,返回1,代表登入成功
db.auth("admin", "password")

# 檢視當前資料庫中的使用者,下面兩種方式都可以
db.getUsers()、show users
 
# 建立使用者(user:使用者名稱、pwd:密碼、role:角色、db:資料庫名)
db.createUser({ user:"admin", pwd:"password", roles: [{role: "root", db: "admin" }] }) 
db.createUser({
    user:"admin",
    pwd:"password",
    roles: [{role: "root", db: "admin" }]
}) 

# 刪除使用者,admin是刪除的使用者名稱
db.dropUser("admin")  

# 修改使用者密碼
db.updateUser( "admin", {pwd: "123456"})
db.updateUser( "admin", {
    pwd: "abc666"
})
  • MongoDB資料庫中的內建角色:
(1)、【資料庫使用者角色】針對每一個數據庫進行控制。
read:提供了讀取所有非系統集合,以及系統集合中的system.indexes, system.js, system.namespaces
readWrite:包含了所有read許可權,以及修改所有非系統集合的和系統集合中的system.js的許可權.
 
 
(2)、【資料庫管理角色】每一個數據庫包含了下面的資料庫管理角色。
dbOwner:該資料庫的所有者,具有該資料庫的全部許可權。
dbAdmin:一些資料庫物件的管理操作,但是沒有資料庫的讀寫許可權。(參考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:為當前使用者建立、修改使用者和角色。擁有userAdmin許可權的使用者可以將該資料庫的任意許可權賦予任意的使用者。
 
 
(3)、【叢集管理許可權】admin資料庫包含了下面的角色,使用者管理整個系統,而非單個數據庫。這些許可權包含了複製集和共享叢集的管理函式。
clusterAdmin:提供了最大的叢集管理功能。相當於clusterManager, clusterMonitor, and hostManager和dropDatabase的許可權組合。
clusterManager:提供了叢集和複製集管理和監控操作。擁有該許可權的使用者可以操作config和local資料庫(即分片和複製功能)
clusterMonitor:僅僅監控叢集和複製集。
hostManager:提供了監控和管理伺服器的許可權,包括shutdown節點,logrotate, repairDatabase等。
備份恢復許可權:admin資料庫中包含了備份恢復資料的角色。包括backup、restore等等。
 
 
(4)、【所有資料庫角色】
admin:資料庫提供了一個mongod例項中所有資料庫的許可權角色:
readAnyDatabase:具有read每一個數據庫許可權。但是不包括應用到叢集中的資料庫。
readWriteAnyDatabase:具有readWrite每一個數據庫許可權。但是不包括應用到叢集中的資料庫。
userAdminAnyDatabase:具有userAdmin每一個數據庫許可權,但是不包括應用到叢集中的資料庫。
dbAdminAnyDatabase:提供了dbAdmin每一個數據庫許可權,但是不包括應用到叢集中的資料庫。
 
 
(5)、【超級管理員許可權】
root: dbadmin到admin資料庫、useradmin到admin資料庫以及UserAdminAnyDatabase。但它不具有備份恢復、直接操作system.*集合的許可權,但是擁有root許可權的超級使用者可以自己給自己賦予這些許可權。
 
 
(6)、【備份恢復角色】
backup:資料庫備份
restore:資料庫恢復
 
 
(7)、【內部角色】
__system

2、開啟授權模式啟動

方式一:配置檔案方式啟動

MongoDB資料庫的相關配置資訊,是儲存在mongodb安裝目錄bin目錄中的mongod.cfg檔案中,

  • 找到mongod.cfg檔案,然後增加如下配置:
# 開啟資料庫訪問許可權驗證(注意:換行、縮排格式哦!!)
security:
 authorization: enabled
  • 然後重新啟動MongoDB服務.

方式二:啟動時新增授權引數(以管理員身份啟動CMD)

# 先關閉MongoDB服務,然後移除,最後重新安裝MongoDB服務,帶上--auth引數
net stop MongoDB
mongod --remove
mongod --config "D:\Environment\MongoDB\Server\4.4\bin\mongod.cfg" --install --auth
net start MongoDB

3、超級管理賬戶登入

注:重新啟動mongodb服務後,用一個新的命令視窗來做操作:通過如下圖所示,在配置賬戶許可權後,直接在命令視窗中用 mongo 命令,執行相關的操作是沒有響應的,只有在正確的輸入賬戶和密碼後才進行相關操作!!

  • 連線本地MongoDB資料庫:(不用指定 繫結IP 和 埠號):
    • mongo -u admin -p password
C:\WINDOWS\system32>mongo -u admin -p password
MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7147a968-8d3b-4d03-b056-2a9853e72fac") }
MongoDB server version: 4.4.2
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> show dbs # 沒有使用賬號登入的話該命令查詢不出來資訊
admin   0.000GB
config  0.000GB
local   0.000GB
>
  • 連線遠端MongoDB資料庫:(必須指定 繫結IP 和 埠號):

    • 不指定資料庫名(沒有輸入賬號登入):mongo --host 127.0.0.1 --port 27017
    • 不指定資料庫名(輸入賬號登入):mongo --host 127.0.0.1 --port 27017 -u admin -p password
    C:\WINDOWS\system32>mongo --host 127.0.0.1 --port 27017
    MongoDB shell version v4.4.2
    connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("f562b501-9f79-4f9c-9f09-2ab2b4ffbd22") }
    MongoDB server version: 4.4.2
    > use admin
    switched to db admin
    > show users
    uncaught exception: Error: command usersInfo requires authentication :
    _getErrorWithCode@src/mongo/shell/utils.js:25:13
    DB.prototype.getUsers@src/mongo/shell/db.js:1639:15
    shellHelper.show@src/mongo/shell/utils.js:914:9
    shellHelper@src/mongo/shell/utils.js:819:15
    @(shellhelp2):1:1
    > db.auth("admin", "password")
    1
    > show users
    {
            "_id" : "admin.admin",
            "userId" : UUID("f4000321-33d7-43bd-b791-a42294c4a004"),
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    >
    
    • 指定登入資料庫(輸入賬號登入):mongo 127.0.0.1:27017/admin -u admin -p password
    C:\WINDOWS\system32>mongo 127.0.0.1:27017/admin -u admin -p password
    MongoDB shell version v4.4.2
    connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("e386fea6-9a8d-4620-91a5-033f8cc66f98") }
    MongoDB server version: 4.4.2
    ---
            Enable MongoDB's free cloud-based monitoring service, which will then receive and display
            metrics about your deployment (disk utilization, CPU, operation statistics, etc).
    
            The monitoring data will be available on a MongoDB website with a unique URL accessible to you
            and anyone you share the URL with. MongoDB may use this information to make product
            improvements and to suggest MongoDB products and deployment options to you.
    
            To enable free monitoring, run the following command: db.enableFreeMonitoring()
            To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
    ---
    > db
    admin
    > show users
    {
            "_id" : "admin.admin",
            "userId" : UUID("f4000321-33d7-43bd-b791-a42294c4a004"),
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    >
    

4、給指定DB資料存建立賬戶

這裡以 myweb 資料庫為例,給myweb配置一個賬戶,注:各個不同的資料庫之間,可以建立有一個 或 多個賬戶,各資料庫之間賬戶、密碼都是獨立的,不能互相訪問!

# 登入admin資料庫admin賬戶,給test資料庫 建立一個名為:test 的賬戶,角色為:dbOwner
db.createUser({user:"test", pwd: "password", roles: [{role: "dbOwner", db: "test"}] })
db.createUser({
    user:"test", 
    pwd: "password", 
    roles: [{
        role: "dbOwner", 
        db: "test"
    }]
})

# 登入自己資料庫給自己建立使用者,並且賦予該使用者其他資料庫的許可權
use test
db.createUser({user: "sam1", pwd: "password", roles: [ { role: "readWrite", db: "test" },{ role: "read", db: "db1" }]})
db.createUser({
    user: "sam",
    pwd: "password",
    roles: [
        {role: "readWrite", db: "test"},
        {role: "read", db: "db1"}]
})

示例:

C:\WINDOWS\system32>mongo -u admin -p password
MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("abc1675c-84b4-4681-bc43-02ecb33a03b9") }
MongoDB server version: 4.4.2
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> use admin
switched to db admin
> db.createUser({user:"test", pwd: "password", roles: [{role: "dbOwner", db: "test"}] })
Successfully added user: {
        "user" : "test",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "test"
                }
        ]
}
>

5、連線指定的DB資料庫

資料庫操作

1、資料庫命名規則

MongoDB 資料庫的命名要符合 UTF-8 標準的字串,同時要遵循下表所示的注意事項。

序號 注意事項
1 不能是空串
2 不得含有 /、\、?、$、空格、空字元等,基本只能使用 ASCII 中的字母和數字
3 區分大小寫,建議全部小寫
4 名稱最多為 64 位元組
5 不得使用保留的資料庫名,如:admin、local、config

注意:資料庫最終會成為檔案,資料庫名就是檔案的名稱。

  • 由於資料庫名稱在 MongoDB 中不區分大小寫,因此資料庫名稱不能僅僅區別於字元。
  • 對於在 Windows 上執行的 MongoDB,資料庫名稱不能包含以下字元:/、\、“、$、*、< >、:、|、? 。
  • 對於在 UNIX 和 Linux 系統上執行的 MongoDB,資料庫名稱不能包含以下字元:/、\、。、"、$。
  • 雖然 UTF-8 可以提供很多國家的語言的命名格式,在 MongoDB 資料庫命名時也可以使用漢字作為資料庫名,但是最好儘量採用英文字母、數字、字元等為主的命名格式。

示例:

  • 正確的命名格式:myDB、my_NewDB、myDB12

  • 錯誤的命名格式:.myDB、/123

保留資料庫:MongoDB 系統保留的資料庫如下:

庫名 作用
admin 許可權資料庫,新增使用者到該資料庫中,該使用者會自動繼承資料庫的所有許可權
local 資料庫中的資料永遠不會被複制
config 分片時,config 資料庫在內部使用,儲存分子資訊
test 預設資料庫,可以用來做各種測試等

2、建立切換資料庫

建立、開啟、切換 資料庫:use dbname

use 
> use mydb
switched to db mydb

注:

  1. 如果開啟的這個資料庫存在就是開啟這個資料庫。
  2. 如果開啟的是一個不存在的資料庫(沒有這個資料庫名字),那麼就會建立一個同名的資料庫。
  3. 建立一個新的資料庫時,需要向資料庫中建立集合並且插入一條資料,這個資料庫才能建立成功!否則show dbs查詢不到此資料庫

示例:往集合中插入一條資料。可以不用先建立集合,直接往裡新增資料即可:

# user 就是集合(表)名
db.user.insert({"name": "xiaoming"})     

當命令執行後,資料庫系統發現 user 是一個數據集合不存的,就自動建立一個集合,並隨著資料的插入,資料庫和集合也就真正的建立成功了。

3、檢視資料庫

  • 檢視當前所在資料庫(預設為test):db
  • 檢視所有資料庫:show dbs
  • 檢視當前資料庫相關資訊(名稱、文件個數、檢視、索引、大小等):db.stats()
> db
test
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>
> db.stats()                       # 統計資料資訊
{
        "db" : "test",             # 資料庫名
        "collections" : 0,         # 集合數量
        "views" : 0,
        "objects" : 0,             # 文件數量
        "avgObjSize" : 0,          # 平均每個文件的大小
        "dataSize" : 0,            # 資料佔用空間大小,不包括索引,單位為位元組
        "storageSize" : 0,         # 分配的儲存空間
        "totalSize" : 0,           # 總共空間大小
        "indexes" : 0,             # 索引個數
        "indexSize" : 0,           # 索引佔用空間大小
        "scaleFactor" : 1,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
}

備註:為什麼查詢所有資料庫時沒有看到當前預設的test資料庫呢?因為test資料庫內沒有資料,實際上不算真正意義上的存在。

4、刪除資料庫

刪除當前所在的資料庫:db.dropDatabase()

注:刪除後集閤中的所以文件、以及相關的索引等都會被刪除!!

> db.dropDatabase()
{ "ok" : 1 }

5、備份及匯入匯出

MongoDB 4.4版本 之後 MongoDB資料庫工具現在與MongoDB服務 分開發布 需要單獨安裝

  • 下載地址:https://docs.mongodb.com/database-tools/
  • 下載安裝或解壓,配置到環境變數 path 中,然後可以使用 mongodump、 mongorestore、 mongoimport、 mongoexport 命令
  • 在匯入其他人的庫後,應該清空 -->該庫下的使用者 -->再建立使用者後再連線

資料匯出與匯入:mongoexport、mongoimport

5.1、資料匯出工具:mongoexport

1、概念:

mongoDB 中的 mongoexport 工具可以把一個 collection(集合) 匯出成JSON格式或CSV格式的檔案。可以通過引數指定匯出的資料項,也可以根據指定的條件匯出資料。

2、語法:

mongoexport -d dbname -c cname -o file --type json/csv -f field

引數說明:

  • -d、--db:資料庫名

  • -c 、--collection:集合名

  • -o、--out :輸出的檔名

  • --type: 輸出的格式,預設為json。可以為json/csv

  • -f:輸出的欄位,如果-type為csv,則需要加上-f "欄位名"

  • -h:指明資料庫宿主機的IP。如是本機可以去除該引數

  • -u:指明資料庫的使用者名稱

  • -p:指明資料庫的密碼

示例:

# 匯出dbname資料庫的cname集合中所有 _id,user_id,user_name,age,status 欄位到 /mongoBack/cname.json檔案中
mongoexport -d dbname -c cname -o /mongoBack/cname.json -f "_id,user_id,user_name,age,status"

5.2、資料匯入工具 :mongoimport

當要插入的資料太多時,一條一條的insert在繁瑣了。所以,我們可以在程式碼編輯器中以JSON格式編輯好要插入的資料,以 *.json 檔案格式儲存,然後匯入資料庫:下面就是將mydata.json檔案,匯入到test資料庫的student集合中。

1、語法:

mongoimport -d dbname -c cname --file filename --headerline -f field

引數說明:

  • -d :資料庫名

  • -c :collection名

  • --type :匯入的格式預設json。可以為json/csv

  • -f :匯入的欄位名

  • --headerline :如果匯入的格式是csv,則可以使用第一行的標題作為匯入的欄位

  • --file :要匯入的檔案

  • --drop:匯入前把集合中的資料清空

  • -h:指明資料庫宿主機的IP。如是本機可以去除該引數

  • -u:指明資料庫的使用者名稱

  • -p:指明資料庫的密碼

示例:

# 把/mongoBack/cname.json中的資料匯入dbname資料中的cname集合中,並且只匯入_id,user_id,user_name,age,status欄位
mongoimport -d dbname -c cname --file /mongoBack/cname.json -f "_id,user_id,user_name,age,status" --drop

MongoDB備份與恢復:mongodump、mongorestore

5.3、備份 :mongodump

1、語法:

mongodump -h host -u user -d dname -o dbdirectory

引數說明:

  • -d: 需要備份的資料庫例項,例如:test

  • -o: 備份的資料存放位置,該路徑需要提前建立。例:/home/mongodump/

  • -h:指明資料庫宿主機的IP。如是本機可以去除該引數

  • -u:指明資料庫的使用者名稱

  • -p:指明資料庫的密碼

  • --port:埠號。如是預設可以去除該引數

示例:

# 備份單個表
mongodump -u user -p 123 --authenticationDatabase admin -d dname -c cname -o /backup/mongodb/dname_d_bak_201507021701.bak

# 備份單個庫
mongodump -u user -p 123 --authenticationDatabase admin -d dname -o /backup/mongodb/

# 備份所有庫
mongodump -u user -p 123 --authenticationDatabase admin -o /backup/allbak 

# 備份所有庫推薦使用新增--oplog引數的命令,這樣的備份是基於某一時間點的快照,只能用於備份全部庫時才可用,單庫和單表不適用:
mongodump -h 127.0.0.1 --port 27017 --oplog -o /backup/allbak 

5.4、恢復:mongorestore

1、語法:

mongorestore -h host -u user -d dname --dir dbdirectory

引數或名:

  • -d: 需要恢復的資料庫例項,當然這個名稱也可以和備份時候的不一樣,比如test2

  • --dir: 備份資料所在位置,例如:/home/mongodump/itcast/

  • --drop: 恢復前把集合中的資料清空。

  • -h: MongoDB所在伺服器地址。如是本機可以去除該引數

  • -u:指明資料庫的使用者名稱

  • -p:指明資料庫的密碼

  • --port:埠號。如是預設可以去除該引數

示例:

# 恢復單表
mongorestore -u user -p 123 --authenticationDatabase admin -d dname -c cname /backup/mongodb/dname_d_bak_201507021701.bak/myTest/d.bson  

# 恢復單個庫:
mongorestore -u user -p 123 --authenticationDatabase admin -d dname /backup/mongodb/

# 恢復所有庫:
mongorestore -u user -p 123 --authenticationDatabase admin /backup/allbak

# 備份時如果加了--oplogReplay引數,恢復時也要加上--oplogReplay引數,具體命令如下(下面是恢復單庫的命令):
mongorestore -d dname --oplogReplay /home/mongo/swrdbak/swrd/

注意:

1、mongorestore恢復資料預設是追加,如打算先刪除後匯入,可以加上--drop引數,不過新增--drop引數後,會將資料庫資料清空後再匯入,如果資料庫備份後又新加入了資料,也會將新加的資料刪除,它不像mysql有一個存在的判斷

2、mongodump在mongo關閉時,也是可以備份的,不過需要指定資料目錄,命令為:mongodump --dbpath /data/db

使用MongoDB其他命令列工具遠端操作連線時,儘量加上如下引數.

 --authenticationDatabase admin

6、檢視幫助文件

1、資料庫幫助命令

  • 匯入工具所有操作方法:mongoexport --help

  • 匯出工具所有操作方法:mongoimport --help

  • 備份工具所有操作方法:mongodump --help

  • 恢復工具所有操作方法:mongorestore --help

  • 列出MongoDB資料庫所有的操作方法:db.help()

  • 列出MongoDB文件(表)所有的操作方法:db.collection.help()

集合操作

1、集合命名規則

MongoDB 的集合就相當於 MySQL 的一個表 table,集合是一組文件,是無模式的,集合名稱要求符合 UTF-8 標準的字串,同時要遵循下表所示的注意事項。

序號 注意事項
1 集合名不能是空串
2 不能含有空字元 \0
3 不能以“system.”開頭,這是系統集合保留的字首
4 集合名不能含保留字元“$”

對於分別部署在 Windows、Linux、UNIX 系統上的 MongoDB,集合的命名方式與資料庫命名方式一致。

2、集合建立

MongoDB 集合的建立有顯式和隱式(推薦)兩種方法。

2.1、顯示建立集合函式db.createCollection(name, options)

語法格式:db.createCollection(name,options)
name:要建立的集合名稱
options:可選引數,指定有關記憶體大小及索引的選項
  • options 可以是如下引數:
引數 型別 描述
capped Boolean (可選)如果為 true,則啟用封閉的集合。上限集合是固定大小的集合,它在達到其最大時自動覆蓋其最舊的條目。如果指定 true,則還需要指定 size 引數
autoindexid Boolean (可選)如果為 true,自動在 _id 欄位建立索引。預設為false。
size 數字 (可選)指定上限集合的最大大小(以位元組為單位)。如果 capped 為 true,那麼還需要指定此欄位的值
max 數字 (可選)指定上限集合中允許的最大文件數
  • 建立無引數的集合:
db.createCollection('day1')
  • 建立帶引數的集合:
# 建立名為day2的固定集合,集合空間大小為:2000000kb(大約1.9g),文件最大個數為:1000
db.createCollection('day2',{capped:true,autoIndexId:true,size:2000000,max:1000})
  • 示例:
> db.createCollection('day1')
{ "ok" : 1 }
> 
> db.createCollection('day2',{capped:true,autoIndexId:true,size:2000000,max:1000})
{
        "note" : "The autoIndexId option is deprecated and will be removed in a future release",
        "ok" : 1
}
> show collections
day1
day2
students
> 

2.2、隱式建立集合(推薦):

當插入文件時,如果集合不存在,則 MongoDB會隱式地自動建立集合:

db.myDB.insert({"name": "tom"})

3、集合查詢

MySQL 列出的所有表都可以使用 show tables。MongoDB 列出所有集合可以使用如下兩種方式:

  • show tables

  • show collections

  • db.getCollectionNames()

> db
test
> show tables
dept
student
> show collections
dept
student
> db.getCollectionNames()
[ "dept", "student" ]
>     

4、集合刪除

集合刪除(當前集合):db.collection.drop();

> db.day1.drop()
true

5、集合修改

集合重新命名:db.collection.renameCollection();

> db.students.renameCollection("student")
{ "ok" : 1 }                                                                                                           

文件操作

1、文件命名規則

2、資料插入

注:插入資料時不需要專門去建立集合(表),因為插入資料時會自動建立集合!!

save():如果 _id 主鍵存在則更新資料,如果不存在就插入資料。該方法新版本中已廢棄,已使用 insertOne()replaceOne() 來代替。

insert():若插入的資料主鍵已經存在,則會拋 org.springframework.dao.DuplicateKeyException 異常,提示主鍵重複,不儲存當前資料.

  • db.collection.insert():插入一個或者多個文件

  • db.collection.insertOne():用於向集合插入一個新文件,語法格式如下:

    db.collection.insertOne(<document>,{
          writeConcern: <document>
    })
    
  • db.collection.insertMany():用於向集合插入一個多個文件,語法格式如下:

    db.collection.insertMany([ <document1> , <document2>, ... ],{
          writeConcern: <document>,
          ordered: <boolean>
    })
    
  • 引數說明:

    • document:要寫入的文件。
    • writeConcern:寫入策略,預設為 1,即要求確認寫操作,0 是不要求。
    • ordered:指定是否按順序寫入,預設 true,按順序寫入。
  • 插入資料:這裡以student集合為例!

# insert 插入一條資料
db.student.insert({"name": "zhangsan", "age": 28, "sex": "男", job: "JAVA"});

# insert 插入多條資料
db.student.insert([
    {"name": "zhangsan", "age": 32, "sex": "男", job: "JAVA"},
    {"name": "wangwu", "age": 16, "sex": "男", job: "Web前端"}
]);
 
# 插入1條資料
db.student.insertOne({"name": "xiaoming", "age": 28, "sex": "男", job: "Web前端"});

# 插入多條資料
db.student.insertMany([
    {"name": "zhangsan", "age": 32, "sex": "男", job: "JAVA"},
    {"name": "lisi", "age": 28, "sex": "女", job: "PHP"},
]);
  • 示例:
> # insert 插入一條資料
> db.student.insert({"name": "zhangsan", "age": 28, "sex": "男", job: "JAVA"});
WriteResult({ "nInserted" : 1 })
>
> # insert 插入多條資料
> db.student.insert([
...     {"name": "zhangsan", "age": 32, "sex": "男", job: "JAVA"},
...     {"name": "wangwu", "age": 16, "sex": "男", job: "Web前端"}
... ]);
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
>
> # 插入1條資料
> db.student.insertOne({"name": "xiaoming", "age": 28, "sex": "男", job: "Web前端"});
{
        "acknowledged" : true,
        "insertedId" : ObjectId("5fd4c7676817e7a0fa646b85")
}
>
> # 插入多條資料
> db.student.insertMany([
...     {"name": "zhangsan", "age": 32, "sex": "男", job: "JAVA"},
...     {"name": "lisi", "age": 28, "sex": "女", job: "PHP"},
... ]);
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5fd4c7706817e7a0fa646b86"),
                ObjectId("5fd4c7706817e7a0fa646b87")
        ]
}
>

3、資料查詢

4、資料更新

5、資料刪除

MongoDB 使用 remove()delete() 方法來刪除集合中的文件。

  • remove() 方法

  • delete() 方法

3.1、remove() 方法

db.collection.remove(<query>,{
	justOne: <boolean>, writeConcern: <document>
})

引數說明:

  • query:必選項,是設定刪除的文件的條件。
  • justOne:布林型的可選項,預設為false,刪除符合條件的所有文件,如果設為 true,則只刪除一個文件。
  • writeConcem:可選項,設定丟擲異常的級別。

注意

此方法已經過時,官方推薦使用deleteOne和deleteMany函式來實現刪除操作。且remove()函式並不會真正的釋放掉儲存空間,需要刪除後,再用管理員許可權的賬戶執行db.repairDatabase()函式來釋放儲存空間!

  • remove 刪除全部:db.day.remove({})

  • remove 條件刪除:db.day.remove({age:10})

32、delete() 方法