Published on

MongoDB

Authors
  • avatar
    Name
    MissTree
    Twitter

安装

MongoDB 官网 MongoDB 安装就不再赘述,之前有实践说明过

核心特点

  • 灵活的数据模型:MongoDB 使用灵活的文档模型来存储数据,每个文档可以包含不同的字段和数据类型,无需预先定义模式。
  • 高性能:MongoDB 采用了内存映射文件(MMAP)的方式,将数据直接存储在内存中,提供快速的读写性能,支持索引、聚合管道和分片,能够高效处理大规模数据和高并发请求。
  • 文档模型:MongoDB 使用 BSON(Binary JSON)格式存储数据,数据以文档的形式组织,类似于 JSON 对象。每个文档可以包含嵌套的结构,支持数组和子文档。
  • 高可用性:通过副本集(Replica Set)实现数据冗余和自动故障转移。
  • 水平扩展:通过分片(Sharding)支持数据的分布式存储,适合处理海量数据。
  • 丰富的查询语言:支持复杂的查询、聚合操作和地理空间查询。
  • 多语言支持:提供多种编程语言的驱动程序(如 Python、Java、Node.js 等)

核心概念

  • 文档(Document):MongoDB 中的数据以文档的形式存储,类似于 JSON 对象。每个文档可以包含不同的字段和数据类型。
    {
     "_id": ObjectId("64b8f1a2e4b0a1a2b3c4d5e6"),
     "name": "Alice",
     "age": 25,
     "address": {
       "city": "New York",
       "zip": "10001"
     },
     "hobbies": ["reading", "traveling"]
    }
    
  • 集合(Collection):类似于关系型数据库中的表,用于存储具有相似结构的文档。
    • 类似于关系型数据库中的表,用于存储文档。
    • 集合是无模式的,文档结构可以不同。
  • 数据库(Database):
    • 多个集合的容器,每个 MongoDB 实例可以包含多个数据库。
  • _id 字段:
    • 每个文档都有一个唯一的 _id 字段,作为主键。如果没有提供,MongoDB 会自动生成一个 ObjectId。

数据模型

MongoDB 采用了灵活的文档模型来存储数据,每个文档可以包含不同的字段和数据类型,无需预先定义模式。这使得 MongoDB 非常适合处理半结构化和非结构化数据。

  • 文档模型:MongoDB 使用 BSON(Binary JSON)格式存储数据,数据以文档的形式组织,类似于 JSON 对象。每个文档可以包含嵌套的结构,支持数组和子文档。

MongoDB 的文档模型非常灵活,支持以下特性:

  • 嵌套文档:文档中可以包含子文档。
  • 数组:文档中可以存储数组。
  • 动态字段:文档的字段可以动态添加或删除。
{
  "name": "Bob",
  "age": 30,
  "contact": {
    "email": "bob@example.com",
    "phone": "123-456-7890"
  },
  "skills": ["MongoDB", "Node.js", "JavaScript"]
}

查询语言

MongoDB 提供了丰富的查询语言,支持复杂的查询、聚合操作和地理空间查询。

  • 基本查询:使用查询操作符(如 eqeq、gt、$lt 等)进行基本查询。
  • 高级查询:使用聚合管道(Aggregation Pipeline)进行复杂的查询和分析。
  • 地理空间查询:支持地理空间查询,如地理位置查询、距离查询等。
// 基本查询
db.collection.find({ "age": 30 })
// 投影 返回 name 和 age 字段
db.collection.find({ "age": { $gt: 30 } })
// 聚合查询
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$customer", total: { $sum: "$amount" } } }
]);

//支持单字段索引、复合索引、全文索引和地理空间索引。
db.users.createIndex({ age: 1 }); // 创建升序索引

更多查询方式


高可用性与扩展性

  • 副本集(Replica Set):
    • 副本集是 MongoDB 的高可用性解决方案,主节点负责写操作,从节点负责读操作和数据冗余。
    • 副本集由多个节点组成,其中一个节点为主节点(Primary),其他节点为从节点(Secondary)。
    • 主节点负责处理写操作,从节点负责处理读操作。
  • 分片(Sharding):
    • 分片是 MongoDB 的水平扩展解决方案,将数据分散存储在多个节点上,实现数据的分布式存储,通过分片键(Shard Key)决定数据分布。。
    • 每个分片都是一个独立的 MongoDB 实例,可以独立进行读写操作。
    • 分片集群由多个分片节点组成,每个分片节点负责存储一部分数据,适合处理海量数据和高并发场景。

适用场景

MongoDB 适用于以下场景:

  • 内容管理系统(CMS):灵活的模式适合存储多变的文档数据。
  • 实时分析:高效的查询和聚合操作适合实时数据分析。
  • 物联网(IoT):支持时间序列数据和高吞吐量写入。
  • 社交网络:嵌套文档和数组适合存储复杂的用户关系和数据,存储用户生成的内容和社交关系。
  • 移动应用:支持地理位置查询和地理位置索引。
  • 缓存层:可以作为缓存数据库,替代 Redis 或 Memcached。
  • 企业应用:支持复杂的查询和事务处理。

优缺点

  • 优点:
    • 灵活的数据模型:MongoDB 采用灵活的文档模型,支持嵌套文档和数组,适合处理半结构化和非结构化数据。
    • 高性能:MongoDB 采用内存映射文件(MMAP)的方式,将数据直接存储在内存中,提供快速的读写性能。
    • 高可用性:通过副本集实现数据冗余和自动故障转移。 -丰富的生态系统和社区支持。
  • 缺点:
    • 数据一致性:由于数据模型的灵活性,可能会导致数据一致性问题。

    • 不支持复杂的事务处理:MongoDB 不支持复杂的事务处理,需要借助其他工具或解决方案。

    • 内存占用较高,适合大内存服务器。

    • 不支持事务(早期版本,4.0 以后支持多文档事务)。

    • 不支持 ACID 事务。


查看 node 使用方式


总结

MongoDB 是一个功能强大且灵活的文档型数据库,适合处理半结构化和非结构化数据。它的高性能、高可用性和易扩展性使其成为现代应用开发的热门选择。无论是小型项目还是大规模分布式系统,MongoDB 都能提供出色的支持。