以下是基于 MongoDB Shell 的完整操作示例,覆蓋數據庫管理、集合操作、文檔處理、聚合分析、索引管理等核心功能,并結合實際場景說明。所有示例均結合搜索結果中的技術要點整理而成。
一、連接與配置管理
1. 啟動 MongoDB Shell 并連接實例
# 默認連接本地 27017 端口
mongo# 連接遠程實例并認證
mongo -u admin -p password --host rs0/centos1104 --port 27500
說明:通過
--host
和--port
指定實例地址,-u
和-p
提供認證信息。
2. 配置 .mongorc.js
自動加載腳本
在用戶目錄下創建 .mongorc.js
文件:
// 每次啟動 Shell 時自動切換到 test 數據庫
use test;
print("已自動切換到 test 數據庫");
作用:初始化 Shell 環境,簡化重復操作。
二、數據庫與集合管理
1. 數據庫操作
// 查看所有數據庫
show dbs;// 創建并切換到新數據庫
use mydb;// 刪除當前數據庫
db.dropDatabase();
注意:MongoDB 在插入數據前不會物理創建數據庫。
2. 集合操作
// 顯式創建集合(可指定配置)
db.createCollection("users", { capped: true, size: 100000 });// 查看當前數據庫的所有集合
show collections;// 重命名集合
db.users.renameCollection("new_users");// 刪除集合
db.new_users.drop();
說明:
capped
集合為固定大小的循環集合,適合日志場景。
三、文檔操作(CRUD)
1. 插入文檔
// 插入單條文檔
db.users.insertOne({ name: "Bob", age: 25, email: "bob@example.com",hobbies: ["reading", "gaming"]
});// 插入多條文檔
db.users.insertMany([{ name: "Alice", age: 30, status: "active" },{ name: "Charlie", age: 22, status: "inactive" }
]);
特性:支持嵌套數組(如
hobbies
)和動態模式。
2. 查詢文檔
// 查詢所有文檔
db.users.find();// 條件查詢(精確匹配)
db.users.find({ status: "active" });// 范圍查詢(年齡大于 25)
db.users.find({ age: { $gt: 25 } });// 數組查詢(包含 "gaming" 的 hobbies)
db.users.find({ hobbies: "gaming" });// 投影(僅顯示 name 和 email 字段)
db.users.find({}, { name: 1, email: 1, _id: 0 });
高級用法:
$gt
表示大于,1
表示包含字段,0
表示排除。
3. 更新文檔
// 更新單條文檔
db.users.updateOne({ name: "Bob" }, { $set: { age: 26 },$push: { hobbies: "traveling" }}
);// 更新多條文檔
db.users.updateMany({ status: "inactive" }, { $set: { status: "pending" } }
);
操作符:
$set
修改字段,$push
向數組添加元素。
4. 刪除文檔
// 刪除單條文檔
db.users.deleteOne({ name: "Charlie" });// 刪除多條文檔
db.users.deleteMany({ age: { $lt: 20 } });
注意:刪除操作不可逆,建議先使用
find()
確認條件。
四、查詢進階技巧
1. 正則匹配查詢
// 查找 name 以 "A" 開頭的文檔
db.users.find({ name: /A.*/i });
說明:
/i
表示忽略大小寫。
2. 使用 $where
執行 JavaScript 函數
// 查詢 age 字段為偶數的文檔
db.users.find({$where: function() {return (this.age % 2 === 0);}
});
限制:性能較低,慎用于大數據集。
五、聚合管道(Aggregation Pipeline)
1. 基礎聚合統計
// 按 status 分組并統計數量
db.users.aggregate([{ $group: { _id: "$status", count: { $sum: 1 } } }
]);
輸出示例:
{ "_id": "active", "count": 3 }
{ "_id": "pending", "count": 2 }
說明:
$group
階段按字段分組,$sum
累加計數。
2. 多階段聚合(過濾+分組+排序)
db.users.aggregate([{ $match: { age: { $gt: 20 } } }, // 過濾年齡 >20 的用戶{ $group: { // 按狀態分組_id: "$status", avgAge: { $avg: "$age" }, // 計算平均年齡total: { $sum: 1 } // 統計數量}},{ $sort: { avgAge: -1 } } // 按平均年齡降序排序
]);
輸出示例:
{ "_id": "active", "avgAge": 31.5, "total": 4 }
{ "_id": "pending", "avgAge": 28.0, "total": 2 }
特性:支持多階段鏈式處理,適合復雜分析場景。
六、索引管理
1. 創建索引
// 為 name 字段創建升序索引
db.users.createIndex({ name: 1 });// 為 email 創建唯一索引
db.users.createIndex({ email: 1 }, { unique: true });
說明:
1
表示升序,-1
表示降序。
2. 查看索引
// 查看集合的所有索引
db.users.getIndexes();// 查看數據庫所有集合的索引
db.getCollectionNames().forEach(function(collection) {print("Index for " + collection);printjson(db[collection].getIndexes());
});
用途:診斷索引性能瓶頸。
七、事務處理(需副本集環境)
// 啟動事務
const session = db.getMongo().startSession();
session.startTransaction();try {// 在事務中執行操作db.accounts.updateOne({ name: "Alice" }, { $inc: { balance: -500 } }, { session });db.accounts.updateOne({ name: "Bob" }, { $inc: { balance: 500 } }, { session });// 提交事務session.commitTransaction();
} catch (error) {// 出錯回滾session.abortTransaction();throw error;
}
限制:需 MongoDB 4.2+ 副本集環境,支持多文檔原子操作。
八、備份與恢復
1. 使用 mongodump
備份數據
# 備份整個數據庫
mongodump --host rs0/centos1104 --port 27500 -u admin -p password --db test --out /backup/# 僅備份特定集合
mongodump --collection users --db test --out /backup/
2. 使用 mongorestore
恢復數據
# 從備份恢復
mongorestore --host rs0/centos1104 --port 27500 -u admin -p password /backup/test/
注意:恢復前需確保目標數據庫不存在沖突集合。
九、權限管理
1. 創建數據庫賬號
// 在 admin 數據庫中創建管理員賬號
use admin;
db.createUser({user: "admin_user",pwd: "secure_password",roles: [{ role: "userAdminAnyDatabase", db: "admin" },{ role: "readWriteAnyDatabase", db: "admin" }]
});
2. 授予集合級別權限
// 在 test 數據庫中創建只讀賬號
use test;
db.createUser({user: "readonly",pwd: "123456",roles: [{ role: "read", db: "test" }]
});
說明:權限模型遵循最小權限原則,適合生產環境安全控制。
以上示例覆蓋 MongoDB Shell 的核心操作,實際應用中需結合具體業務需求調整參數和邏輯。更多細節可參考 MongoDB 官方文檔及搜索結果中的技術說明。