Mongodb數據庫應用

目錄

什么是mongodb

主要特點

MongoDB 概念解析

完整術語列表

MongoDB 安裝

MongoDB Shell

安裝 MongoDB Shell

驗證 MongoDB Shell

數據庫管理

查看數據庫列表

創建數據庫

實例

刪除數據庫

實例

默認數據庫

系統內置數據庫

集合管理

查看集合

創建集合

實例

更新集合名

renameCollection?命令的語法:

參數說明:

實例

刪除聚合

語法格式:

實例

文檔操作

常用的插入文檔方法包括:

insertOne()

參數說明:

實例

insertMany()

參數說明:

實例

查詢文檔

find () 方法

參數說明:

查找所有文檔:

說明:

說明:

findOne () 方法

除文檔刪

deleteOne()

deleteMany()

語法:

實例

findOneAndDelete()

語法:

實例

更新文檔

updateOne()

語法:

實例

updateMany()

語法:

實例

replaceOne()

語法:

實例

MongoDB 備份 (mongodump) 與恢復 (mongorestore)

安裝備份與恢復命令

?MongoDB 數據備份

MongoDB 數據恢復

MongoDB 用戶管理

連接到 MongoDB

?切換到目標數據庫

創建用戶

驗證用戶

啟用身份驗證

使用用戶身份登錄

刪除用戶

實例操作

什么是mongodb

MongoDB 是一個文檔型數據庫,數據以類似 JSON 的文檔形式存儲。
MongoDB 的設計理念是為了應對大數據量、高性能和靈活性需求。
MongoDB 使用集合(Collections)來組織文檔(Documents),每個文檔都是由鍵值對組成的。

  • 數據庫(Database):存儲數據的容器,類似于關系型數據庫中的數據庫。
  • 集合(Collection):數據庫中的一個集合,類似于關系型數據庫中的表。
  • 文檔(Document):集合中的一個數據記錄,類似于關系型數據庫中的行(row),以 BSON 格式存儲。

MongoDB 將數據存儲為一個文檔,數據結構由鍵值 (key=>value) 對組成,文檔類似于 JSON 對象,字段值可以包含其他文檔,數組及文檔數組:

主要特點

  • 文檔導向的存儲:MongoDB 是一個面向文檔的數據庫,它以 JSON-like 的格式存儲數據,使得數據結構更加靈活和豐富。
  • 索引優化查詢:MongoDB 允許用戶為文檔中的任意屬性創建索引,例如 FirstName 和 Address,從而提高查詢效率和排序性能。
  • 數據鏡像與擴展性:通過本地或網絡創建數據的副本,MongoDB 實現了強大的數據冗余和擴展能力。
  • 水平擴展與分片:面對增加的負載,MongoDB 可以通過分片技術將數據分布到計算機網絡中的其他節點上,實現水平擴展。
  • 強大的查詢語言:MongoDB 使用 JSON 格式的查詢語法,支持復雜的查詢表達式,包括對內嵌對象和數組的查詢。
  • 數據更新:利用 update () 命令,MongoDB 能夠替換整個文檔或更新指定的數據字段,
  • MapReduce 批量處理:MongoDB 的 MapReduce 功能專為大規模數據處理和聚合操作設計,通過 Map 函數的 emit (key, value) 調用和 Reduce 函數的邏輯處理,實現高效的數據匯總。
  • MapReduce 腳本編寫:Map 和 Reduce 函數使用 JavaScript 編寫,可以通過 db.runCommand 或 mapreduce 命令在 MongoDB 中執行。
  • GridFS 大文件存儲:GridFS 是 MongoDB 內置的功能,用于存儲和檢索大于 BSON 文檔大小限制的文件,如圖片和視頻。
  • 服務端腳本執行:MongoDB 允許在服務端執行 JavaScript 腳本,提供了直接在服務端執行或存儲函數定義以供后續調用的能力。
  • 多語言支持:MongoDB 提供了對多種編程語言的支持,包括但不限于 RUBY、PYTHON、JAVA、C++、PHP 和 C#。

MongoDB 概念解析

SQL 術語 / 概念MongoDB 術語 / 概念解釋 / 說明
databasedatabase數據庫
tablecollection數據庫表 / 集合
rowdocument數據記錄行 / 文檔
columnfield數據字段 / 域
indexindex索引
table joins表連接,MongoDB 不支持
primary keyprimary key主鍵,MongoDB 自動將_id 字段設置為主鍵

完整術語列表

文檔(Document):MongoDB 的基本數據單元,通常是一個 JSON-like 的結構,可以包含多種數據類型。

集合(Collection):類似于關系型數據庫中的表,集合是一組文檔的容器。在 MongoDB 中,一個集合中的文檔不需要有一個固定的模式。

數據庫(Database):包含一個或多個集合的 MongoDB 實例。

BSON:Binary JSON 的縮寫,是 MongoDB 用來存儲和傳輸文檔的二進制形式的 JSON。

索引(Index):用于優化查詢性能的數據結構,可以基于集合中的一個或多個字段創建索引。

分片(Sharding):一種分布數據到多個服務器(稱為分片)的方法,用于處理大數據集和高吞吐量應用。

副本集(Replica Set):一組維護相同數據集的 MongoDB 服務器,提供數據的冗余備份和高可用性。

主節點(Primary):副本集中負責處理所有寫入操作的服務器。

從節點(Secondary):副本集中的服務器,用于讀取數據和在主節點故障時接管為主節點。

MongoDB Shell:MongoDB 提供的命令行界面,用于與 MongoDB 實例交互。

聚合框架(Aggregation Framework):用于執行復雜的數據處理和聚合操作的一系列操作。

Map-Reduce:一種編程模型,用于處理大量數據集的并行計算。

GridFS:用于存儲和檢索大于 BSON 文檔大小限制的文件的規范。

ObjectId:MongoDB 為每個文檔自動生成的唯一標識符。

CRUD 操作:創建(Create)、讀取(Read)、更新(Update)、刪除(Delete)操作。

事務(Transactions):從 MongoDB 4.0 開始支持,允許一組操作作為一個原子單元執行。

操作符(Operators):用于查詢和更新文檔的特殊字段。

連接(Join):MongoDB 允許在查詢中使用 $lookup 操作符來實現類似 SQL 的連接操作。

TTL(Time - To - Live):可以為集合中的某些字段設置 TTL,以自動刪除舊數據。

存儲引擎(Storage Engine):MongoDB 用于數據存儲和管理的底層技術,如 WiredTiger 和 MongoDB 的舊存儲引擎 MMAPv1。

MongoDB Compass:MongoDB 的圖形界面工具,用于可視化和管理 MongoDB 數據。

MongoDB Atlas:MongoDB 提供的云服務,允許在云中托管 MongoDB 數據庫。

MongoDB 安裝

MongoDB 的安裝過程簡單直觀,便于用戶快速部署和使用。MongoDB 提供了 linux 各個發行版本 64 位的安裝包,你可以在官網下載安裝包。

安裝前我們需要安裝各個 Linux 平臺依賴包

dnf install libcurl openssl -y

解壓安裝包

ar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz

將解壓包拷貝到指定目錄

mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb

MongoDB 的可執行文件位于 bin 目錄下,所以可以將其添加到 PATH 路徑中:

echo 'export PATH=/usr/local/mongodb/bin:$PATH' >>/etc/profile
source /etc/profile

創建數據庫目錄
默認情況下 MongoDB 啟動后會初始化以下兩個目錄:

  • 數據存儲目錄:/var/lib/mongodb
  • 日志文件目錄:/var/log/mongodb

我們在啟動前可以先創建這兩個目錄并設置當前用戶有讀寫權限:

[root@localhost ~]#mkdir -p /var/lib/mongo
[root@localhost ~]#mkdir -p /var/log/mongodb
[root@localhost ~]#chown `whoami` /var/lib/mongo    # 設置權限
[root@localhost ~]#chown `whoami` /var/log/mongodb  # 設置權限

由于 mongodb 依賴 openssl11,需要編譯安裝 openssl11

[root@localhost ~]# dnf install -y gcc make perl
[root@localhost ~]# tar xzf openssl-1.1.1w.tar.gz
[root@localhost ~]# cd openssl-1.1.1w
[root@sentinel01 openssl-1.1.1w]#./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
[root@sentinel01 openssl-1.1.1w]#make -j$(nproc)
[root@sentinel01 openssl-1.1.1w]#make install

接下來啟動 Mongodb 服務:

[root@localhost ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

看到以下信息,說明啟動成功。

MongoDB Shell

MongoDB Shell 是 MongoDB 提供的官方交互式界面,允許用戶與 MongoDB 數據庫進行交互、執行命令和操作數據庫。

MongoDB Shell 是基于 JavaScript 的,允許用戶直接在命令行或者腳本中使用 JavaScript 語言來操作 MongoDB 數據庫。

安裝 MongoDB Shell

解壓安裝包,將 bin 目錄中 mongosh 二進制文件復制到 PATH 變量中列出的目錄中,例如 /usr/local/bin:

[root@localhost ~]# tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz
[root@localhost ~]# cd mongosh-2.5.0-linux-x64-openssl3
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# cd bin/
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_v1.so /usr/local/lib/

驗證 MongoDB Shell

打開你的終端并使用 mongosh 命令連接到 MongoDB 服務器:

mongosh --host <hostname> --port <port>

說明:

  • mongosh:啟動 MongoDB Shell 命令行工具。
  • --host <hostname>:指定 MongoDB 服務器的主機名或 IP 地址。
  • <hostname>:MongoDB 服務器的主機名(如?localhost)或 IP 地址(如 127.0.0.1)。
  • --port <port>:指定 MongoDB 服務器的端口號。
  • <port>:MongoDB 服務器監聽的端口號,默認端口是 27017。

輸入 mongosh 默認連接本地 mongodb 數據庫,看到以下信息說明登錄成功,warnings 警告為優化提醒,可以暫時忽略,如若生產環境部署需要處理

plaintext

[root@sentinel01 bin]# mongosh
Current Mongosh Log ID: 680a1533277aa1c07b1b26ff
Connecting to:        mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.0
Using MongoDB:        8.0.8
Using Mongosh:        2.5.0For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/The server generated these startup warnings when booting
2025-04-24T18:22:55.898280+08:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prod-notes-filesystem
2025-04-24T18:22:55.898280+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2025-04-24T18:22:55.898280+08:00: You are running this process as the root user, which is not recommended2025-04-24T18:22:55.898280+08:00: This server is bound to localhost. Remote systems will be unable to connect to this server. Start the server with --bind_ip <address> to specify which IP addresses it should serve responses from, or with --bind_ip_all to bind to all interfaces. If this behavior is desired, start the server with --bind_ip 127.0.0.1 to disable this warning
2025-04-24T18:22:55.898280+08:00: Soft rlimits too low
2025-04-24T18:22:55.898280+08:00: For customers running the database memory allocator we suggest changing the contents of the following sysctl file
2025-04-24T18:22:55.898280+08:00: We suggest setting the contents of /proc/sys/vm/zone_reclaim_mode to 0 or 1, as a
wapping can cause performance problems.test>

數據庫管理

查看數據庫列表

要查看當前 MongoDB 實例中所有數據庫的列表,可以使用?show dbs?命令:

> show dbs

要查看當前正在使用的數據庫,可以使用?db?命令:

> db

創建數據庫

在 MongoDB 中,數據庫的創建是一個簡單的過程,當你首次向 MongoDB 中插入數據時,如果數據庫不存在,MongoDB 會自動創建它。
我們只需選擇一個數據庫名稱,并開始向其中插入文檔即可。

當你使用?use?命令來指定一個數據庫時,如果該數據庫不存在,MongoDB 將自動創建它。
MongoDB 創建數據庫的語法格式如下:

use DATABASE_NAME

如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。

實例

以下實例我們創建了數據庫 runoob:

test> use runoob
switched to db runoob
runoob> db
runoob
runoob>

執行 use runoob 命令后,MongoDB 將創建名為 runoob 的新數據庫。此時,你可以開始在這個數據庫中創建集合和插入文檔。

如果你想查看所有數據庫,可以使用 show dbs 命令:

runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
runoob>

可以看到,我們剛創建的數據庫 runoob 并不在數據庫的列表中,要顯示它,我們需要向 runoob 數據庫插入一些數據。

runoob> db.runoob.insertOne({"name":"zhangsan"})
{acknowledged: true,insertedId: ObjectId('680a18f4277aa1c07b1b2700')
}
runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
runoob  40.00 KiB
runoob>

刪除數據庫

如果你需要刪除數據庫,可以使用?db.dropDatabase()?方法:

use myDatabase
db.dropDatabase()

上述命令將刪除當前正在使用的 myDatabase 數據庫及其所有集合。

實例
runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
runoob  40.00 KiB
runoob> use runoob
already on db runoob
test> db.dropDatabase()
{ ok: 1, dropped: 'runoob' }
runoob> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB

默認數據庫

MongoDB 中默認的數據庫為 test,如果沒有創建新的數據庫,數據將存放在 test 數據庫中。

當通過 shell 連接到 MongoDB 實例時,如果未使用 use 命令切換到其他數據庫,則會默認使用 test 數據庫。

例如,在啟動 MongoDB 實例并連接到 MongoDB shell 后,如果開始插入文檔而未顯式指定數據庫,MongoDB 將默認使用 test 數據庫。

系統內置數據庫

在 MongoDB 中,admin、config 和 local 是三個特殊的系統內置數據庫

  • admin 數據庫:存儲所有數據庫的用戶身份信息和全局權限(如 root 用戶)。用戶必須通過 admin 數據庫認證后才能執行跨庫管理操作。
  • config 數據庫:僅在分片集群環境中存在。存儲分片信息、塊(chunk)分布、集合分片策略等關鍵元數據。
  • local 數據庫:存儲當前節點的副本集狀態、操作日志(oplog)等本地數據。數據不會被復制到其他節點,僅存在于當前實例。

集合管理

查看集合

查看當前庫已有集合,可以使用?show collections?或?show tables?命令

> show collections

創建集合

MongoDB 中使用?createCollection()?方法來創建集合。

語法格式

db.createCollection(name, options)

參數說明

  • name:要創建的集合名稱。
  • options:可選參數,指定有關內存大小及索引的選項。

options?可以是如下參數:

參數名類型描述示例值
capped布爾值是否創建一個固定大小的集合。true
size數值集合的最大大小(以字節為單位)。僅在?capped?為?true?時有效。10485760(10MB)
max數值集合中允許的最大文檔數。僅在?capped?為?true?時有效。5000
validator對象用于文檔驗證的表達式。{ $jsonSchema: { ... } }
validationLevel字符串指定文檔驗證的嚴格程度。
"off":不進行驗證。
"strict":插入和更新操作都必須通過驗證(默認)。
"moderate":僅現有文檔更新時必須通過驗證,插入新文檔時不需要。
"strict"
validationAction字符串指定文檔驗證失敗時的操作。
"error":阻止插入或更新(默認)。
"warn":允許插入或更新,但會發出警告。
"error"
storageEngine對象為集合指定存儲引擎配置。{ wiredTiger: { ... } }
collation對象指定集合的默認排序規則。{ locale: "en", strength: 2 }

在插入文檔時,MongoDB 首先檢查固定集合的?size?字段,然后檢查?max?字段。

使用這些選項創建一個集合的實例:

db.createCollection("myComplexCollection", {capped: true,size: 10485760,max: 5000,validator: { $jsonSchema: {bsonType: "object",required: ["name", "email"],properties: {name: {bsonType: "string",description: "必須為字符串且為必填項"},email: {bsonType: "string",pattern: ".*@.*\\..*$",description: "必須為有效的電子郵件地址"}}}},validationLevel: "strict",validationAction: "error",storageEngine: {wiredTiger: { configString: "block_compressor=zstd" }},collation: { locale: "en", strength: 2 }
});

這個例子創建了一個集合,具有以下特性:
固定大小,最大 10MB,最多存儲 5000 個文檔。
文檔必須包含 name 和 email 字段,其中 name 必須是字符串,email 必須是有效的電子郵件格式。
驗證級別為嚴格,驗證失敗將阻止插入或更新。
使用 WiredTiger 存儲引擎,指定塊壓縮器為 zstd。
默認使用英語排序規則。

實例

在 test 數據庫中創建 runoob 集合:

> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }

注意: 在 MongoDB 中,集合只有在內容插入后才會創建,就是說,創建集合(數據表)后要再插入一個文檔(記錄),集合才會真正創建。

更新集合名

在 MongoDB 中,不能直接通過命令來重命名集合。
MongoDB 可以使用?renameCollection?方法來重命名集合。

renameCollection?命令的語法:
db.adminCommand({renameCollection: "sourceDb.sourceCollection",to: "targetDb.targetCollection",dropTarget: <boolean>
})
參數說明:
  • renameCollection:要重命名的集合的完全限定名稱(包括數據庫名)。
  • to:目標集合的完全限定名稱(包括數據庫名)。
  • dropTarget(可選):布爾值。如果目標集合已經存在,是否刪除目標集合。默認值為?false
實例

假設你要將 test 數據庫中的 oldCollection 重命名為 newCollection,可以按以下步驟進行:

確保已連接到 test 數據庫

use test

運行 renameCollection 命令

db.adminCommand({renameCollection: "test.oldCollection",to: "test.newCollection" });

如果你要將集合重命名到另一個數據庫,例如將 test 數據庫中的 oldCollection 重命名為 production 數據庫中的 newCollection,可以這樣做:

db.adminCommand({renameCollection: "test.oldCollection",to: "production.newCollection" });

刪除聚合

MongoDB 中使用?drop()?方法來刪除集合。
drop()?方法可以永久地從數據庫中刪除指定的集合及其所有文檔,這是一個不可逆的操作,因此需要謹慎使用。

語法格式:
db.collection名稱.drop()

如果成功刪除選定集合,則?drop()?方法返回?true,否則返回?false

實例

在數據庫?mydb?中,我們可以先通過?show collections?命令查看已存在的集合:

>use mydb
switched to db
>db.createCollection("kgc")
{ ok: 1 }
mydb>show collections
kgc

接著刪除集合?kgc?:

>db.kgc.drop()
true

通過?show collections?再次查看數據庫?mydb?中的集合:

>show collections

從結果中可以看出?kgc?集合已被刪除。

文檔操作

文檔的數據結構和 JSON 基本一樣。所有存儲在集合中的數據都是 BSON 格式。BSON 是一種類似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱。

常用的插入文檔方法包括:

方法用途是否棄用
insertOne()插入單個文檔
insertMany()插入多個文檔
insert()插入單個或多個文檔
save()插入或更新文檔

在 MongoDB 中,插入文檔時如果集合(Collection)不存在,數據庫會自動創建該集合。這是 MongoDB 的默認行為,也是其無模式設計(Schema-less)的核心特性之一

insertOne()

insertOne()?方法用于在集合中插入單個文檔。

db.collection名稱.insertOne(document, options)

參數說明

  • document:要插入的單個文檔。
  • options(可選):一個可選參數對象,可以包含?writeConcern?和?bypassDocumentValidation?等。
實例
db.myCollection.insertOne({name: "Alice",age: 25,city: "New York"
});

返回結果

{"acknowledged": true,"insertedId": ObjectId("60c72b2f9b1d8b5af8e2b2d")
}

insertMany()

insertMany()?方法用于在集合中插入多個文檔。

db.collection.insertMany(documents, options)

參數說明

  • documents:要插入的文檔數組。
  • options(可選):一個可選參數對象,可以包含?orderedwriteConcern?和?bypassDocumentValidation?等。
實例

插入多個文檔的示例(示例未完整展示 )。

db.myCollection.insertMany([{ name: "Bob", age: 30, city: "Los Angeles" },// 可繼續添加更多文檔...
]);

返回結果:

{"acknowledged": true,"insertedIds": [ObjectId("60c72b2f9b1d8b5af8e2b2e"),ObjectId("60c72b2f9b1d8b5af8e2b2f")]
}

查詢文檔

MongoDB 查詢文檔使用?find()findOne()?方法。

find () 方法

find()?方法以非結構化的方式來顯示所有文檔。

MongoDB 查詢數據的語法格式如下:

db.collection.find(query, projection)

參數說明

  • query:用于查找文檔的查詢條件。默認為?{},即匹配所有文檔。
  • projection(可選):指定返回結果中包含或排除的字段。
查找所有文檔:

實例

db.myCollection.find();

按條件查找文檔:

db.myCollection.find({ age: { $gt: 25 } });

說明:
?

$gt?是 MongoDB 的比較操作符,表示 “大于”(Greater Than)。
這個條件的作用是篩選出 age 字段值大于 25 的文檔。

類似的其他比較操作符

  • $gt(大于)、$lt(小于)、$gte(大于等于)、$lte(小于等于)
  • $eq(等于)、$ne(不等于)

按條件查找文檔,并只返回指定字段:

實例

db.myCollection.find({ age: { $gt: 25 } },{ name: 1, age: 1, _id: 0 }
);

說明:

{ name: 1, age: 1, _id: 0 }?- 投影(Projection)
用于控制返回的字段(類似 SQL 中的 SELECT 語句):1?表示包含該字段,0?表示排除該字段。例如?_id: 0?表示排除默認返回的?_id?字段。所以最終返回的文檔僅包含?name?和?age?字段。

如果你需要以易讀的方式來讀取數據,可以使用?pretty()?方法,語法格式如下:

>db.myCollection.find().pretty()

pretty()?方法以格式化的方式來顯示所有文檔。

findOne () 方法

findOne()?方法用于查找集合中的單個文檔。如果找到多個匹配的文檔,它只返回第一個。

語法

db.collection.findOne(query, projection)
  • query:用于查找文檔的查詢條件。默認為?{},即匹配所有文檔。
  • projection(可選):指定返回結果中包含或排除的字段。

查詢單個文檔:

db.myCollection.findOne({ name: "Alice" });

查詢單個文檔,并只返回指定字段:

db.myCollection.findOne({ name: "Alice" },{ name: 1, age: 1, _id: 0 }
);

除文檔刪

常用的刪除文檔方法包括?deleteOne()deleteMany()?以及?findOneAndDelete()

deleteOne()

deleteOne()?方法用于刪除匹配過濾器的單個文檔。

語法

db.myCollection.findOne({ name: "Alice" });

參數說明

  • filter:用于查找要刪除的文檔的查詢條件。
  • options(可選):一個可選參數對象。

實例

db.collection.deleteOne(filter, options)

返回結果:

{"acknowledged": true,"deletedCount": 1
}

deleteMany()

deleteMany()?方法用于刪除所有匹配過濾器的文檔。

語法

db.collection.deleteMany(filter, options)
  • filter:用于查找要刪除的文檔的查詢條件。
  • options(可選):一個可選參數對象。
實例
db.myCollection.deleteMany({ name: "Bob" });

返回結果

{"acknowledged": true,"deletedCount": 1
}

findOneAndDelete()

findOneAndDelete()?方法用于查找并刪除單個文檔,并可以選擇返回刪除的文檔。

語法

db.collection.findOneAndDelete(filter, options)
  • filter:用于查找要刪除的文檔的查詢條件。
  • options:可選參數對象,如?projectionsort?等。
實例
db.myCollection.findOneAndDelete({ name: "Charlie" },{ projection: { name: 1, age: 1 } }
);

findOneAndDelete?返回被刪除的文檔,如果找不到匹配的文檔,則返回?null

更新文檔

在 MongoDB 中,更新文檔的操作可以使用多種方法實現,常用的方法包括?updateOne()updateMany()replaceOne()?和?findOneAndUpdate()

插入測試數據

db.myCollection.insertMany([{ name: "Alice", age: 25, city: "Los Angeles", status: "inactive" },{ name: "Bob", age: 30, city: "Los Angeles", status: "active" },{ name: "Charlie", age: 35, city: "Chicago", status: "active" }
]);

預先插入用于演示更新操作的測試文檔數據。

updateOne()

updateOne()?方法用于更新匹配過濾器的單個文檔。

語法

db.collection.updateOne(filter, update, options)

參數說明

  • filter:用于查找文檔的查詢條件。
  • update:指定更新操作的文檔或更新操作符。
  • options:可選參數對象,如?upsertarrayFilters?等。
實例
db.myCollection.updateOne({ name: "Alice",        // 過濾條件age: { $ne: 26 }      // 過濾條件},  { $set: { age: 26 } },   // 更新操作{ upsert: false }        // 可選參數
);

upsert?選項:

  • false(默認值):若沒有匹配文檔,不執行任何操作。
  • true:若未找到匹配文檔,將插入一個新文檔(合并查詢條件和更新操作的內容)。
    例如本案例,不匹配時會插入新文檔?{ name: "Alice", age: 26 }

更新單個文檔:

db.myCollection.updateOne({ name: "Alice" },{ $set: { age: 28 } }
);

updateMany()

updateMany()?方法用于更新所有匹配過濾器的文檔。

語法

db.collection.updateMany(filter, update, options)

參數說明

  • filter:用于查找文檔的查詢條件。
  • update:指定更新操作的文檔或更新操作符。
  • options:可選參數對象,如?upsertarrayFilters?等。
實例
db.myCollection.updateMany({ age: { $lt: 30 } },          // 過濾條件{ $set: { status: "active" } },// 更新操作{ upsert: false }              // 可選參數
);

更新多個文檔:

db.myCollection.updateMany({ age: { $lt: 30 } },{ $set: { status: "active" } }
);
replaceOne()

replaceOne()?方法用于替換匹配過濾器的單個文檔,新的文檔將完全替換舊的文檔。

語法

db.collection.replaceOne(filter, replacement, options)

參數說明

  • filter:用于查找文檔的查詢條件。
  • replacement:新的文檔,將替換舊的文檔。
  • options:可選參數對象,如?upsert?等。
實例
db.myCollection.findOneAndUpdate({ name: "Charlie" },          // 過濾條件{ $set: { age: 30 } },        // 更新操作{ returnDocument: "after" }   // 可選參數,返回更新后的文檔
);

查找并更新單個文檔

db.myCollection.findOneAndUpdate({ name: "Charlie" },{ $set: { age: 30 } },{ returnDocument: "after" }
);

MongoDB 備份 (mongodump) 與恢復 (mongorestore)

安裝備份與恢復命令

[root@localhost ~]# rpm -ivh mongodb-database-tools-rhel8-x86_64-100.6.0.rpm

?MongoDB 數據備份

在 MongoDB 中使用?mongodump?命令來備份數據,該命令可導出所有數據到指定目錄中。

mongodump?命令可通過參數指定導出的數據所屬的服務器。

?mongodump?命令的基本語法:

mongodump -h dbhost -d database -o dbdirectory
  • -h:指定 MongoDB 所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
  • -d:指定要備份的數據庫實例,例如:test
  • -o:指定備份數據的存放位置,例如:/data/dump,當然該目錄需要提前建立,當備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里存放該數據庫實例的備份數據。
[root@localhost ~]# mongodump

執行?mongodump?命令后,客戶端會連接到?ip?為?127.0.0.1、端口號為?27017?的 MongoDB 服務上,并備份所有數據到命令執行所在目錄下的?dump/?目錄中

[root@localhost ~]# mongodump
2025-04-25T22:44:21.307+0800    writing admin.system.version to dump/admin/system.version.bson
2025-04-25T22:44:21.307+0800    done dumping admin.system.version (1 document)
2025-04-25T22:44:21.308+0800    writing mydb.myCollection to dump/mydb/myCollection.bson
2025-04-25T22:44:21.308+0800    writing test.myComplexCollection to dump/test/myComplexCollection.bson
2025-04-25T22:44:21.310+0800    writing test.myCollection to dump/test/myCollection.bson
2025-04-25T22:44:21.313+0800    done dumping test.myCollection (3 documents)
2025-04-25T22:44:21.313+0800    done dumping test.myComplexCollection (0 documents)
2025-04-25T22:44:21.334+0800    done dumping mydb.myCollection (3 documents)
[root@localhost ~]# ls
dump

mongodump 命令可選參數列表

語法描述實例(部分顯示)
mongodump --host HOST_NAME --port PORT_NUMBER備份所有 MongoDB 數據mongodump --host runoob.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY(描述未完整顯示 )mongodump --dbpa...
mongodump --collection COLLECTION --db DB_NAME備份指定數據庫的集合mongodump --collection mycol -d test

MongoDB 數據恢復

MongoDB 使用?mongorestore?命令恢復備份數據,

?mongorestore?命令腳本語法如下:

mongorestore -h <hostname><:port> -d dbname <path>
  • --host <:port>/-h <:port>:MongoDB 所在服務器地址,默認?localhost:27017
  • --db/-d:需恢復的數據庫實例,如?test,可與備份時名稱不同(舉例?test2?)。
  • --drop:恢復前先刪除目標數據庫數據,備份后添加 / 修改的數據會被刪除,慎用。
  • <path>mongorestore?最后一個參數,設置備份數據所在位置(舉例?c:\data\dump\test?),不能與?--dir?同時用。
  • --dir:指定備份目錄,不能與?<path>?同時用。

執行以下命令:

[root@localhost ~]# mongorestore

mongorestore?默認從當前執行命令路徑下的?dump?目錄中讀取備份數據。

執行以上命令輸出結果如下:

[root@localhost ~]# mongorestore
2025-04-25T22:50:28.111+0800    using default 'dump' directory
2025-04-25T22:50:28.111+0800    preparing collections to restore from
2025-04-25T22:50:28.111+0800    don't know what to do with file "dump/prelude.json", skipping...
2025-04-25T22:50:28.111+0800    reading metadata for mydb.myCollection from dump/mydb/myCollection.metadata.json
2025-04-25T22:50:28.111+0800    reading metadata for test.myCollection from dump/test/myCollection.metadata.json
2025-04-25T22:50:28.111+0800    reading metadata for test.myComplexCollection from dump/test/myComplexCollection.metadata.json
2025-04-25T22:50:28.125+0800    restoring test.myCollection from dump/test/myCollection.bson
2025-04-25T22:50:28.134+0800    restoring mydb.myCollection from dump/mydb/myCollection.bson
2025-04-25T22:50:28.136+0800    finished restoring test.myCollection (3 documents, 0 failures)
2025-04-25T22:50:28.140+0800    restoring test.myComplexCollection from dump/test/myComplexCollection.bson
2025-04-25T22:50:28.148+0800    finished restoring mydb.myCollection (3 documents, 0 failures)
2025-04-25T22:50:28.151+0800    finished restoring test.myComplexCollection (0 documents)
2025-04-25T22:50:28.151+0800    no indexes to restore for collection mydb.myCollection
2025-04-25T22:50:28.151+0800    no indexes to restore for collection test.myCollection
2025-04-25T22:50:28.151+0800    no indexes to restore for collection test.myComplexCollection
2025-04-25T22:50:28.151+0800    6 document(s) restored successfully. 0 document(s) failed to restore.

MongoDB 用戶管理

在 MongoDB 中進行用戶管理涉及用戶的創建、分配角色、認證和登錄等操作。以下是使用 MongoDB Shell(mongosh?)進行用戶管理的詳細說明,包括創建用戶、分配角色、認證和登錄的具體步驟。

連接到 MongoDB

mongosh

?切換到目標數據庫

use test

創建用戶

使用?db.createUser?命令創建用戶并分配角色。
示例:創建名為?testuser、密碼為?password123?的用戶,賦予?readWrite?和?dbAdmin?角色(需替換?<database_name>?為實際數據庫名 )。

db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "<database_name>" },{ role: "dbAdmin", db: "<database_name>" }]
})

驗證用戶

創建用戶后,使用?db.auth?命令驗證用戶身份,傳入用戶名和密碼進行認證。

db.auth("testuser", "password123")

啟用身份驗證

為確保只有經過身份驗證的用戶能訪問 MongoDB,需啟用身份驗證。

編輯 MongoDB 配置文件?mongod.conf,添加內容:

security:authorization: "enabled"

重啟 MongoDB 服務使更改生效;

或在啟動命令中添加認證參數

mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

使用用戶身份登錄

啟用身份驗證后,用創建的用戶身份連接到 MongoDB

mongosh --host <hostname> --port <port> -u "testuser" -p "password123" --authenticationDatabase "<database_name>"

刪除用戶

使用?db.dropUser?命令刪除指定用戶,

示例刪除?testuser?用戶。

db.dropUser("testuser")

實例操作

完整示例操作流程:

啟動?mongosh?并連接到服務器。

mongosh --host localhost --port 27017

切換到?testdb?數據庫。

use testdb

創建?testuser?用戶,賦予?testdb?數據庫的?readWrite?和?read?角色。

db.createUser({user: "testuser",pwd: "password123",roles: [{ role: "readWrite", db: "testdb" },{ role: "read", db: "testdb" }]
})

重啟 MongoDB 服務并開啟認證

mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

使用Mongodb服務器開啟認證

# 以 testuser 用戶身份連接到 MongoDB,指定認證數據庫為 testdb
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"# 切換到 testdb 數據庫
test> use testdb;
switched to db testdb# 查看 testdb 數據庫中的集合
testdb> show collections

去除認證后重啟mongodb,登錄刪除testuser用戶

# (需先去除認證并重啟 mongod 后執行)刪除 testuser 用戶
db.dropUser("testuser")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911949.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

以太網基礎與 VLAN 配置實驗

以太網是一種基于CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享通訊介質的數據網絡通訊技術。當主機數目較多時會導致沖突嚴重、廣播泛濫、性能顯著下降甚至造成網絡不可用等問題。通過交換機實現 LAN 互連雖然可以解決沖突嚴重的問題&#xff0c;但仍然不…

開源流程引擎Camunda簡介

目錄 簡單介紹 主要組件與名詞介紹 常見名詞解釋 核心組件介紹 一些思考 與前端的關系 前端邏輯的簡化 后端接口的專注 流程引擎的控制作用 數據和狀態的管理 監控和管理的集中化 參考資料 簡單介紹 Camunda的本質是可以獨立運行的一套流程引擎&#xff0c;流程引擎…

從面試題出發,如何設計消息隊列

一、引言 在 Java 開發面試的戰場上&#xff0c;消息隊列相關問題一直是高頻考點。面試官們常常拋出這樣的問題&#xff1a;“如果讓你設計一個消息隊列&#xff0c;你會怎么做&#xff1f;” 這可不是在故意刁難&#xff0c;背后有著深層次的考察意圖。? 從實際場景來看&am…

卡薩帝發布AI深度科技:實現從守護生活到守護文明的升級

2025年6月25日&#xff0c;以“AI致遠 愛不凡”為主題的卡薩帝思享薈于重慶科學會堂啟幕。活動現場&#xff0c;卡薩帝發布“AI深度科技”。同時&#xff0c;搭載AI深度科技的“AI鑒賞家套系”同步上市。 AI浪潮下&#xff0c;卡薩帝品牌不斷升級&#xff0c;從“高端家電領導…

FastAPI + PyMySQL 報錯:“dict can not be used as parameter”的原因及解決方案

? FastAPI PyMySQL 報錯 “dict can not be used as parameter” 問題及解決方案 最近在開發一個基于 FastAPI 的碳足跡因子智能匹配系統時&#xff0c;后端保存接口數據到 MySQL 時遇到了如下錯誤&#xff1a; ? 解析失敗: dict can not be used as parameter 一、問題背景…

解決 “docker-compose: command not found“ 錯誤

解決 “docker-compose: command not found” 錯誤 在 CentOS 7 上看到這個錯誤&#xff0c;說明系統中未安裝 docker-compose。以下是完整的安裝和配置步驟&#xff1a; 一、安裝 Docker Compose 1. 確保已安裝 Docker # 檢查 Docker 是否安裝 docker --version# 如果未安…

Android11 深休后系統定時喚醒導致網絡請求服務器過載

硬件平臺&#xff1a;QCS6125 軟件平臺&#xff1a;Android11 問題&#xff1a;每天的7:00和22:00 服務器會突然收到批量設備的網絡請求&#xff0c;導致服務器過載。 通過系統的logcat日志發現了系統在休眠后&#xff0c;每天會有22:00、7:00的喚醒&#xff0c;從而導致這個時…

部署網站需求全滿足:Websoft9 多應用托管一站式方案解析

在數字化浪潮中&#xff0c;搭建專業網站已成為企業觸達客戶的核心通道。然而&#xff0c;從服務器選型到軟件環境配置&#xff0c;傳統建站模式往往讓技術門檻成為中小企業的 “攔路虎”。Websoft9 多應用托管平臺通過深度優化的鏡像技術&#xff0c;重新定義了 WordPress 建站…

Spring Boot 啟動優化實踐

本文系統性分析并優化了一個Spring Boot項目啟動耗時高達 280 秒的問題。通過識別瓶頸、優化分庫分表加載邏輯、異步初始化耗時任務等手段&#xff0c;最終將啟動耗時縮短至 159 秒&#xff0c;提升近 50%。文章涵蓋啟動流程分析、性能熱點識別、異步初始化設計等關鍵技術細節&…

Jenkins執行Jenkinsfile報錯

遇到部署的步驟時傳輸文件到其他服務器&#xff0c;文件傳上去了&#xff0c;但是命令都沒有執行成功。 寫法&#xff1a; 報錯了&#xff1a;ERROR:Exception when publishing,exception message [Exec exit status not zero.Status [1]] 原因是因為&#xff1a;cd 引用了環…

Modbus TCP轉Profibus DP網接APM810/MCE安科瑞多功能電表通訊案例

Modbus TCP轉Profibus DP網接APM810/MCE安科瑞多功能電表通訊案例 在工業自動化和電力監控領域&#xff0c;Modbus TCP與Profibus DP是兩種常見的通訊協議&#xff0c;它們各自有著廣泛的應用場景和優勢。而當需要將這兩者進行連接&#xff0c;以實現不同設備間的數據傳輸和信…

MySQL常見問題概述

一、MySQL常見問題概述 MySQL是最常用的關系型數據庫&#xff0c;但使用中常會遇到 性能慢、數據丟失、主從不同步、鎖沖突 等問題。這些問題可能導致系統響應變慢、用戶操作失敗&#xff0c;甚至數據損壞。 核心解決思路&#xff1a;先定位問題類型&#xff08;是查詢慢&…

zlmediakit windows 編譯webrtc

1、環境準備 系統環境&#xff1a;Windows 10 專業版 序號名稱版本用途1Microsoft Visual Studio20222openssl3.0.53cmake3.24.04libsrtp2.4.0webrtc播放需要 2、安裝libsrtp https://github.com/cisco/libsrtp/releases/tag/v2.4.2 2.1、新建構建目錄 在libsrtp-2.4.2根目錄…

Redis Pipelining 是性能加速的秘密武器?

在高性能的現代應用中&#xff0c;Redis 因其閃電般的速度而備受青睞。而 Pipelining&#xff08;管道技術&#xff09; 則是 Redis 性能優化的核心功能之一。許多開發者都聽說過它能提升性能&#xff0c;但它究竟是如何做到的&#xff1f;是否會帶來負面影響&#xff1f;今天我…

系統性能優化-6 TCP 三次握手

系統性能優化-6 TCP 三次握手 TCP 三次握手 客戶端優化 客戶端發送 SYN 給服務器 此時客戶端連接狀態&#xff1a;SYN_SENT如果服務器繁忙或中間網絡不暢&#xff0c;客戶端會重發 SYN&#xff0c;重試的次數由 tcp_syn_retries 參數控制&#xff0c;默認是 6 次&#xff0c;第…

WPF 實現自定義彈窗輸入功能

1.前端實現 <Grid><Grid.RowDefinitions><RowDefinition Height"60" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0.1&qu…

WPF中Converter基礎用法

IValueConverter 1.創建一個類集成接口IValueConverter,并實現 2在xaml中引入 舉例 性別用int來表示&#xff0c;1為男&#xff0c;2為女 核心代碼 創建GenderConverter繼承IValueConverter public class GenderConverter : IValueConverter {//model->view轉換public…

Postgresql的json充當字典應用

一般我們會將一些系統參數放到參數表中&#xff0c;有些參數的值是json結構&#xff0c;那么如何在查詢時引用這些參數&#xff1f;&#xff1f; 比如我在業務表的的xxx_type,或xxx_status記錄的是key,又想在查詢的時候顯示其描述。 先定義字典 如下圖如何應用 Postgresql對j…

Dify全面升級:打造極致智能應用開發體驗,攜手奇墨科技共拓AI新生態

智能應用開發平臺Dify以六大核心功能升級與深度性能優化&#xff0c;重新定義AI開發效率與體驗。本次更新不僅響應了開發者社區的迫切需求&#xff0c;更通過與云計算領域先鋒奇墨科技的戰略合作&#xff0c;為企業提供了從開發到部署的全鏈路智能化解決方案。 .技術領先&#…

關于uniapp開發阻止事件冒泡問題

背景。uniapp開發微信小程序。在使用兩個組件拼接嵌套使用后&#xff0c;發現問題&#xff0c;會誤操作跳轉到更多頁面。下圖中兩個事件若不使用stop修飾符&#xff0c;會相互影響。若點擊uni-list-item會串行觸發uni-card的handledoctorlist方法。 產生上面問題原因是組件之間…