MongoDB 基本使用指南:从入门到实践

作者:da吃一鲸8862025.10.13 17:43浏览量:1

简介:本文详细介绍MongoDB数据库的基本使用方法,涵盖安装配置、集合文档操作、索引优化、聚合查询及备份恢复等核心功能,帮助开发者快速掌握非关系型数据库的核心技能。

MongoDB 基本使用指南:从入门到实践

一、MongoDB 基础概念与安装配置

MongoDB 作为文档型非关系型数据库,采用 BSON 格式存储数据,其核心概念包括数据库(Database)、集合(Collection)和文档(Document)。与传统关系型数据库不同,MongoDB 的集合无需预先定义结构,支持动态扩展字段,这种灵活性使其在处理半结构化数据时具有显著优势。

1.1 安装与启动

Windows 环境:从 MongoDB 官网下载 MSI 安装包,安装时勾选 “Install MongoDB as a Service” 选项可自动配置为系统服务。安装完成后需手动创建数据目录(如 C:\data\db),通过命令行 mongod --dbpath=C:\data\db 启动服务。

Linux 环境:推荐使用包管理器安装(如 Ubuntu 的 sudo apt-get install mongodb),或通过官方仓库安装最新版本。启动命令为 sudo systemctl start mongod,配置文件通常位于 /etc/mongod.conf

Docker 部署:使用 docker run -d --name mongo -p 27017:27017 mongo 可快速启动容器,添加 --auth 参数启用认证,或通过 -v 挂载数据卷实现持久化存储。

1.2 连接与认证

通过 MongoDB Shell 连接时,使用 mongo --host <ip> --port <port> 命令。若启用认证,需先创建管理员用户:

  1. use admin
  2. db.createUser({
  3. user: "admin",
  4. pwd: "password",
  5. roles: ["root"]
  6. })

后续连接需添加 -u-p 参数,或在连接字符串中指定:mongodb://admin:password@localhost:27017

二、集合与文档操作

2.1 集合管理

集合创建隐式完成,首次插入文档时自动生成。显式创建集合可指定验证规则:

  1. db.createCollection("users", {
  2. validator: {
  3. $jsonSchema: {
  4. bsonType: "object",
  5. required: ["name", "age"],
  6. properties: {
  7. name: { bsonType: "string" },
  8. age: { bsonType: "int", minimum: 0 }
  9. }
  10. }
  11. }
  12. })

2.2 文档操作

插入文档

  1. db.users.insertOne({
  2. name: "Alice",
  3. age: 28,
  4. hobbies: ["reading", "hiking"],
  5. createdAt: new Date()
  6. })
  7. // 批量插入
  8. db.users.insertMany([
  9. { name: "Bob", age: 32 },
  10. { name: "Charlie", age: 25 }
  11. ])

查询文档

  1. // 条件查询
  2. db.users.find({ age: { $gt: 25 } })
  3. // 逻辑组合
  4. db.users.find({
  5. $or: [{ age: { $lt: 20 } }, { name: /^C/ }]
  6. })
  7. // 投影(字段筛选)
  8. db.users.find({}, { name: 1, _id: 0 })

更新文档

  1. // 替换整个文档
  2. db.users.updateOne(
  3. { name: "Alice" },
  4. { $set: { age: 29, status: "active" } }
  5. )
  6. // 数组操作
  7. db.users.updateOne(
  8. { name: "Bob" },
  9. { $push: { hobbies: "swimming" } }
  10. )

删除文档

  1. db.users.deleteOne({ name: "Charlie" })
  2. db.users.deleteMany({ status: "inactive" })

三、索引与性能优化

3.1 索引创建

单字段索引:

  1. db.users.createIndex({ name: 1 }) // 1表示升序,-1表示降序

复合索引:

  1. db.users.createIndex({ age: 1, name: -1 })

多键索引(适用于数组字段):

  1. db.users.createIndex({ hobbies: 1 })

3.2 索引管理

查看索引:

  1. db.users.getIndexes()

删除索引:

  1. db.users.dropIndex("name_1")

3.3 性能分析

使用 explain() 分析查询性能:

  1. db.users.find({ age: { $gt: 25 } }).explain("executionStats")

关注 executionStats.totalDocsExaminedexecutionStats.executionTimeMillis 指标,优化方向包括:

  • 为高频查询条件创建索引
  • 避免在索引字段上使用计算或函数
  • 使用覆盖查询(查询字段全部包含在索引中)

四、聚合框架

MongoDB 聚合管道由多个阶段(Stage)组成,每个阶段对输入文档进行转换。

4.1 基础聚合

  1. db.orders.aggregate([
  2. { $match: { status: "completed" } }, // 过滤
  3. { $group: { // 分组统计
  4. _id: "$customerId",
  5. total: { $sum: "$amount" },
  6. count: { $sum: 1 }
  7. }},
  8. { $sort: { total: -1 } }, // 排序
  9. { $limit: 5 } // 限制结果数
  10. ])

4.2 常用聚合操作符

  • $project:重命名字段或计算新字段
  • $unwind:展开数组字段
  • $lookup:关联其他集合(类似 SQL JOIN)
  • $facet:多分支聚合

示例:统计每个用户的订单数及平均金额:

  1. db.orders.aggregate([
  2. { $group: {
  3. _id: "$customerId",
  4. orders: { $sum: 1 },
  5. avgAmount: { $avg: "$amount" }
  6. }},
  7. { $project: {
  8. customerId: "$_id",
  9. _id: 0,
  10. orders: 1,
  11. avgAmount: { $round: ["$avgAmount", 2] }
  12. }}
  13. ])

五、备份与恢复

5.1 逻辑备份

使用 mongodump 工具:

  1. mongodump --host localhost --port 27017 --db test --out /backup

恢复数据:

  1. mongorestore --host localhost --port 27017 --db test /backup/test

5.2 物理备份

对于大型数据库,建议使用文件系统快照:

  1. 执行 fsyncLock 锁定数据库:
    1. use admin
    2. db.runCommand({ fsync: 1, lock: 1 })
  2. 复制数据文件(默认位于 /data/db
  3. 执行 fsyncUnlock 解锁:
    1. db.runCommand({ fsyncUnlock: 1 })

六、最佳实践建议

  1. 数据建模:根据查询模式设计文档结构,嵌套文档适合一对一关系,引用适合多对多关系。
  2. 分片策略:当数据量超过单机容量时,选择合适的分片键(如用户ID、时间戳)避免热点。
  3. 变更流:使用 watch() 监听集合变更,实现实时数据处理:
    1. const collection = db.collection('users');
    2. const changeStream = collection.watch();
    3. changeStream.on('change', (change) => {
    4. console.log('变更事件:', change);
    5. });
  4. 安全配置
    • 启用 TLS 加密
    • 限制网络访问(通过 --bind_ip 参数)
    • 定期轮换凭证

通过系统掌握上述核心功能,开发者可以高效利用 MongoDB 处理各类非结构化数据场景,从日志分析到实时推荐系统均可发挥其优势。建议结合官方文档(docs.mongodb.com)持续学习高级特性如事务、地理空间查询等。