MongoDB常用操作示例

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

相关推荐
zizisuo1 小时前
2.Redis高阶实战
数据库·redis·缓存
YGGP2 小时前
【每日八股】复习 MySQL Day4:日志(一)
数据库·mysql
风筝超冷2 小时前
网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南
数据库·mysql·flask
木木子99992 小时前
WITH在MYSQL中的用法
数据库·mysql
极小狐4 小时前
如何创建并使用极狐GitLab 项目访问令牌?
数据库·ci/cd·gitlab·devops·mcp
言之。5 小时前
【Django】REST 常用类
数据库·django·sqlite
VB.Net6 小时前
C# 综合示例 库存管理系统20 操作员管理(FormAdmin)
开发语言·数据库·c#
码熔burning6 小时前
【MongoDB篇】MongoDB的聚合框架!
数据库·mongodb·nosql
凌叁儿7 小时前
使用PyMongo连接MongoDB的基本操作
数据库·python·mongodb
2401_837088507 小时前
Mysql order by 用法
数据库·mysql