以下是基于 MongoDB Shell 的完整操作示例,覆盖数据库管理、集合操作、文档处理、聚合分析、索引管理等核心功能,并结合实际场景说明。所有示例均结合搜索结果中的技术要点整理而成。
一、连接与配置管理
1. 启动 MongoDB Shell 并连接实例
bash
# 默认连接本地 27017 端口
mongo
# 连接远程实例并认证
mongo -u admin -p password --host rs0/centos1104 --port 27500
说明:通过
--host
和--port
指定实例地址,-u
和-p
提供认证信息。
2. 配置 .mongorc.js
自动加载脚本
在用户目录下创建 .mongorc.js
文件:
javascript
// 每次启动 Shell 时自动切换到 test 数据库
use test;
print("已自动切换到 test 数据库");
作用:初始化 Shell 环境,简化重复操作。
二、数据库与集合管理
1. 数据库操作
javascript
// 查看所有数据库
show dbs;
// 创建并切换到新数据库
use mydb;
// 删除当前数据库
db.dropDatabase();
注意:MongoDB 在插入数据前不会物理创建数据库。
2. 集合操作
javascript
// 显式创建集合(可指定配置)
db.createCollection("users", { capped: true, size: 100000 });
// 查看当前数据库的所有集合
show collections;
// 重命名集合
db.users.renameCollection("new_users");
// 删除集合
db.new_users.drop();
说明:
capped
集合为固定大小的循环集合,适合日志场景。
三、文档操作(CRUD)
1. 插入文档
javascript
// 插入单条文档
db.users.insertOne({
name: "Bob",
age: 25,
email: "[email protected]",
hobbies: ["reading", "gaming"]
});
// 插入多条文档
db.users.insertMany([
{ name: "Alice", age: 30, status: "active" },
{ name: "Charlie", age: 22, status: "inactive" }
]);
特性:支持嵌套数组(如
hobbies
)和动态模式。
2. 查询文档
javascript
// 查询所有文档
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. 更新文档
javascript
// 更新单条文档
db.users.updateOne(
{ name: "Bob" },
{
$set: { age: 26 },
$push: { hobbies: "traveling" }
}
);
// 更新多条文档
db.users.updateMany(
{ status: "inactive" },
{ $set: { status: "pending" } }
);
操作符:
$set
修改字段,$push
向数组添加元素。
4. 删除文档
javascript
// 删除单条文档
db.users.deleteOne({ name: "Charlie" });
// 删除多条文档
db.users.deleteMany({ age: { $lt: 20 } });
注意:删除操作不可逆,建议先使用
find()
确认条件。
四、查询进阶技巧
1. 正则匹配查询
javascript
// 查找 name 以 "A" 开头的文档
db.users.find({ name: /A.*/i });
说明:
/i
表示忽略大小写。
2. 使用 $where
执行 JavaScript 函数
javascript
// 查询 age 字段为偶数的文档
db.users.find({
$where: function() {
return (this.age % 2 === 0);
}
});
限制:性能较低,慎用于大数据集。
五、聚合管道(Aggregation Pipeline)
1. 基础聚合统计
javascript
// 按 status 分组并统计数量
db.users.aggregate([
{ $group: { _id: "$status", count: { $sum: 1 } } }
]);
输出示例:
json
{ "_id": "active", "count": 3 }
{ "_id": "pending", "count": 2 }
说明:
$group
阶段按字段分组,$sum
累加计数。
2. 多阶段聚合(过滤+分组+排序)
javascript
db.users.aggregate([
{ $match: { age: { $gt: 20 } } }, // 过滤年龄 >20 的用户
{ $group: { // 按状态分组
_id: "$status",
avgAge: { $avg: "$age" }, // 计算平均年龄
total: { $sum: 1 } // 统计数量
}},
{ $sort: { avgAge: -1 } } // 按平均年龄降序排序
]);
输出示例:
json
{ "_id": "active", "avgAge": 31.5, "total": 4 }
{ "_id": "pending", "avgAge": 28.0, "total": 2 }
特性:支持多阶段链式处理,适合复杂分析场景。
六、索引管理
1. 创建索引
javascript
// 为 name 字段创建升序索引
db.users.createIndex({ name: 1 });
// 为 email 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true });
说明:
1
表示升序,-1
表示降序。
2. 查看索引
javascript
// 查看集合的所有索引
db.users.getIndexes();
// 查看数据库所有集合的索引
db.getCollectionNames().forEach(function(collection) {
print("Index for " + collection);
printjson(db[collection].getIndexes());
});
用途:诊断索引性能瓶颈。
七、事务处理(需副本集环境)
javascript
// 启动事务
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
备份数据
bash
# 备份整个数据库
mongodump --host rs0/centos1104 --port 27500 -u admin -p password --db test --out /backup/
# 仅备份特定集合
mongodump --collection users --db test --out /backup/
2. 使用 mongorestore
恢复数据
bash
# 从备份恢复
mongorestore --host rs0/centos1104 --port 27500 -u admin -p password /backup/test/
注意:恢复前需确保目标数据库不存在冲突集合。
九、权限管理
1. 创建数据库账号
javascript
// 在 admin 数据库中创建管理员账号
use admin;
db.createUser({
user: "admin_user",
pwd: "secure_password",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
});
2. 授予集合级别权限
javascript
// 在 test 数据库中创建只读账号
use test;
db.createUser({
user: "readonly",
pwd: "123456",
roles: [
{ role: "read", db: "test" }
]
});
说明:权限模型遵循最小权限原则,适合生产环境安全控制。
以上示例覆盖 MongoDB Shell 的核心操作,实际应用中需结合具体业务需求调整参数和逻辑。更多细节可参考 MongoDB 官方文档及搜索结果中的技术说明。