欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > MongoDB常用操作示例

MongoDB常用操作示例

2025/5/7 6:46:51 来源:https://blog.csdn.net/qq_37703224/article/details/147728339  浏览:    关键词:MongoDB常用操作示例

以下是基于 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 官方文档及搜索结果中的技术说明。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词