Skip to content

MongoDB

1109字约4分钟

数据库MongoDB

2024-11-16

MongoDB 是一种流行的NoSQL数据库,使用文档模型来存储数据。它提供了强大的查询语言和丰富的功能。

MongoDB 语法基础教程

一、基本概念

  • 数据库:MongoDB中的数据库是一个容器,用于存储集合。
  • 集合:集合类似于关系型数据库中的表,是文档的容器。
  • 文档:文档是MongoDB的基本数据单元,使用类似JSON的格式(BSON)存储。

二、连接和基本操作

1. 连接到MongoDB

  • 使用MongoDB Shell连接到MongoDB服务器:

    mongo
  • 指定数据库(如果不存在则创建):

    use myDatabase;

2. 数据库操作

  • 查看所有数据库

    show dbs
  • 删除数据库

    db.dropDatabase()

三、集合操作

1. 创建和删除集合

  • 创建集合

    db.createCollection("myCollection")
  • 查看当前数据库中的所有集合

    show collections
  • 删除集合

    db.myCollection.drop()

四、文档操作

1. 插入文档

  • 插入单个文档

    db.myCollection.insertOne({ name: "Alice", age: 25, city: "New York" })
  • 插入多个文档

    db.myCollection.insertMany([
      { name: "Bob", age: 30, city: "San Francisco" },
      { name: "Charlie", age: 35, city: "Los Angeles" }
    ])

2. 查询文档

  • 查询所有文档

    db.myCollection.find()
  • 查询特定条件的文档

    db.myCollection.find({ age: { $gt: 25 } })
  • 格式化输出

    db.myCollection.find().pretty()

3. 更新文档

  • 更新单个文档

    db.myCollection.updateOne(
      { name: "Alice" },
      { $set: { age: 26 } }
    )
  • 更新多个文档

    db.myCollection.updateMany(
      { city: "New York" },
      { $set: { city: "NYC" } }
    )
  • 替换文档

    db.myCollection.replaceOne(
      { name: "Alice" },
      { name: "Alice", age: 27, city: "Boston" }
    )

4. 删除文档

  • 删除单个文档

    db.myCollection.deleteOne({ name: "Charlie" })
  • 删除多个文档

    db.myCollection.deleteMany({ age: { $lt: 30 } })

五、索引操作

  • 创建索引

    db.myCollection.createIndex({ name: 1 })
  • 查看集合的索引

    db.myCollection.getIndexes()
  • 删除索引

    db.myCollection.dropIndex("name_1")

六、聚合操作

  • 使用聚合管道

    db.myCollection.aggregate([
      { $match: { age: { $gte: 25 } } },
      { $group: { _id: "$city", total: { $sum: 1 } } }
    ])

七、高级查询操作

1. 数组查询

MongoDB支持对数组字段的查询操作:

// 查询包含特定元素的数组
db.myCollection.find({hobbies: "reading"})

// 查询数组长度
db.myCollection.find({"hobbies": {$size: 3}})

// 查询数组中满足条件的元素
db.myCollection.find({"scores": {$elemMatch: {$gte: 80, $lt: 90}}})

2. 正则表达式查询

// 使用正则表达式查询
db.myCollection.find({name: /alice/i})

// 使用$regex操作符
db.myCollection.find({name: {$regex: "^A"}})

3. 投影操作

// 只返回指定字段
db.myCollection.find({}, {name: 1, age: 1})

// 排除_id字段
db.myCollection.find({}, {name: 1, age: 1, _id: 0})

八、数据类型

MongoDB支持多种数据类型:

  • String:字符串
  • Integer:整数
  • Boolean:布尔值
  • Double:双精度浮点数
  • Arrays:数组
  • Object:对象
  • Null:空值
  • Timestamp:时间戳
  • Date:日期时间

九、复制集和分片

1. 复制集(Replica Set)

复制集是一组维护相同数据集的MongoDB实例,提供高可用性和数据冗余。

2. 分片(Sharding)

分片是MongoDB的水平扩展机制,将数据分布在多个服务器上。

十、性能优化

1. 索引优化

  • 创建复合索引以支持复杂的查询模式
  • 使用覆盖索引避免读取实际文档
  • 定期重建索引以提高性能

2. 查询优化

  • 使用explain()分析查询性能
  • 避免在查询中使用正则表达式(除非必要)
  • 使用limit()限制返回结果数量

3. 数据建模

  • 根据查询模式设计文档结构
  • 考虑嵌入式文档vs引用式文档
  • 避免过度嵌套的文档结构

十一、备份和恢复

1. 使用mongodump备份

mongodump --db myDatabase --out /backup/

2. 使用mongorestore恢复

mongorestore --db myDatabase /backup/myDatabase/

十二、安全

1. 用户认证

// 创建用户
db.createUser({
    user: "myUser",
    pwd: "myPassword",
    roles: [{role: "readWrite", db: "myDatabase"}]
})

// 启用认证
// 在mongod.conf中设置security.authorization: enabled

2. 角色管理

MongoDB提供多种内置角色:

  • read:读取权限
  • readWrite:读写权限
  • dbAdmin:数据库管理权限
  • userAdmin:用户管理权限
  • clusterAdmin:集群管理权限

十三、监控和诊断

1. 数据库状态

// 查看数据库状态
db.stats()

// 查看集合状态
db.myCollection.stats()

2. 性能监控

// 查看当前操作
db.currentOp()

// 终止操作
db.killOp(opId)

十四、最佳实践

1. 设计原则

  • 根据读写模式设计文档结构
  • 合理使用索引避免性能问题
  • 定期监控和优化数据库性能

2. 开发建议

  • 使用连接池管理数据库连接
  • 避免N+1查询问题
  • 合理处理异常和错误

3. 运维建议

  • 定期备份重要数据
  • 监控数据库性能指标
  • 及时更新MongoDB版本

贡献者: Yibz