当前位置: 首页 > web >正文

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

http://www.xdnf.cn/news/4178.html

相关文章:

  • vue3+ts学习!
  • Banana Pi BPI-CM6 是一款八核 RISC-V 模块,兼容 Raspberry Pi CM 载板
  • 算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)
  • 【Redis篇】linux 7.6安装单机Redis7.0(参数优化详解)
  • Kotlin数据类在Android开发中的应用
  • Linux56 YUM源配置
  • 『Linux_网络』 基于状态机的Connect断线重连
  • 机器学习实操 第二部分 神经网路和深度学习 第13章 使用TensorFlow加载和预处理数据
  • 修改MySQL枚举类型添加‘location‘值
  • 什么是gitlab自动部署,怎么配置gitlab自动部署
  • 论文阅读笔记——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors
  • tinyrenderer笔记(中)
  • Debian系统上PostgreSQL15版本安装调试插件及DBeaver相应配置
  • Flink + Kafka 构建实时指标体系的实战方法论
  • 高防CDN、高防IP vs 高防服务器:核心优势与选型指南
  • Linux Input子系统与驱动开发实战
  • 【Python pass 语句】
  • 人工智能与智能合约:如何用AI优化区块链技术中的合约执行?
  • 基于docker使用showdoc搭建API开发文档服务器
  • Desfire Ev1\Ev2\Ev3卡DES\3K3DES\AES加解密读写VB.Net示例源码
  • 金升阳科技:配套AC/DC砖类电源的高性能滤波器
  • 信息增益详解
  • Matplotlib 饼图
  • 【mysql】常用命令
  • mac m2 安装 hbase
  • git的push.default配置详解
  • 深入理解高性能网络通信:从内核源码到云原生实践
  • Unity中Pico4开发 物体跟随手势模型进行移动
  • vue2 provide 后 inject 数据不是响应式的,不实时更新
  • NetSuite 常用类型Item对应Account异同