以下是 MongoDB 的详细介绍,涵盖核心概念、特性、适用场景及快速入门指南:
一、MongoDB 的核心概念与特点
MongoDB 是一个开源的 NoSQL 文档数据库 ,专为灵活性和可扩展性设计。与传统关系型数据库(如 MySQL)不同,MongoDB 以 JSON-like 格式(BSON) 存储数据,无需固定表结构。
1. 核心特性
-
文档模型
数据以
文档(Document)
形式存储,每个文档是一个键值对集合(类似 JSON),支持嵌套结构和动态字段。{ "_id": ObjectId("5f9d1a2b3c4d5e6f7a8b9c0d"), "name": "Alice", "age": 30, "address": { "city": "New York", "zip": "10001" }, "hobbies": ["reading", "hiking"] }
-
灵活的模式(Schema-less)
无需预定义表结构,可动态添加或修改字段,适合需求频繁变化的场景。
-
高性能
支持内存映射、索引优化和聚合管道,读写速度快,尤其适合高并发场景。
-
水平扩展(Sharding)
通过分片技术将数据分布到多台机器,支持海量数据存储和高吞吐量。
-
高可用性
通过 副本集(Replica Set) 实现自动故障转移,数据冗余存储,确保服务不中断。
-
丰富的查询语言
支持复杂查询(范围、正则、聚合)、地理空间查询和全文搜索。
二、MongoDB vs 关系型数据库
特性 | MongoDB | 关系型数据库(如 MySQL) |
---|---|---|
数据模型 | 文档模型(动态模式) | 表模型(固定模式) |
扩展方式 | 水平扩展(分片) | 垂直扩展(硬件升级) |
事务支持 | 支持多文档事务(4.0+) | 完全支持 ACID 事务 |
适用场景 | 非结构化数据、快速迭代 | 结构化数据、复杂关联查询 |
查询语言 | MongoDB Query Language (MQL) | SQL |
三、核心组件与架构
1. 核心概念
-
数据库(Database):逻辑容器,包含多个集合。
-
集合(Collection):类似表,存储一组文档。
-
文档(Document):数据的基本单元,对应表中的一行。
-
索引(Index):加速查询,支持单字段、复合、全文、地理空间等类型。
2. 高可用架构(副本集)
-
一个副本集包含:
-
Primary 节点:处理所有写操作。
-
Secondary 节点:复制 Primary 数据,提供读操作。
-
Arbiter 节点(可选):不存储数据,仅参与选举。
-
-
若 Primary 宕机,Secondary 自动选举新 Primary。
3. 水平扩展架构(分片集群)
-
分片(Shard):存储数据的子集(如每个分片是一个副本集)。
-
路由(Mongos):接收客户端请求,路由到对应分片。
-
配置服务器(Config Server):存储集群元数据(如分片键)。
四、适用场景
-
内容管理系统(CMS)
灵活存储文章、评论、标签等非结构化数据。
-
实时分析
快速插入和查询日志、用户行为数据。
-
物联网(IoT)
高效处理设备生成的海量时序数据。
-
移动应用
支持离线数据同步和复杂查询。
五、快速入门指南
1. 安装 MongoDB
-
下载地址 :MongoDB Community Server
-
启动服务(默认端口 27017):
bash
mongod --dbpath=/data/db
2. 基本操作(Mongo Shell)
javascript
// 创建/切换数据库 use testdb // 插入文档 db.users.insertOne({ name: "Bob", age: 25, email: "[email protected]" }) // 查询文档 db.users.find({ age: { $gt: 20 } }) // 年龄大于20的用户 // 更新文档 db.users.updateOne( { name: "Bob" }, { $set: { age: 26 } } ) // 删除文档 db.users.deleteOne({ name: "Bob" })
3. 索引优化
javascript
// 创建索引 db.users.createIndex({ email: 1 }) // 1表示升序,-1表示降序 // 查看索引 db.users.getIndexes()
4. 聚合管道(Aggregation)
统计每个城市的用户数量:
javascript
db.users.aggregate([ { $group: { _id: "$address.city", total: { $sum: 1 } } } ])
5. Node.js 示例
安装驱动:npm install mongodb
const { MongoClient } = require("mongodb"); const uri = "mongodb://localhost:27017"; async function main() { const client = new MongoClient(uri); await client.connect(); const db = client.db("testdb"); const collection = db.collection("users"); // 插入文档 await collection.insertOne({ name: "Charlie", age: 28 }); // 查询文档 const users = await collection.find({ age: { $lt: 30 } }).toArray(); console.log(users); await client.close(); } main();