MongoDB 常用语句与应用分析
MongoDB 是一个基于分布式文件存储的 NoSQL 数据库,以 JSON 格式(BSON)存储数据,具有高性能、高可用、易扩展等特点。以下是 MongoDB 的核心概念、常用语句、应用场景及优势的详细分析:
一、核心概念
关系型数据库 | MongoDB | 说明 |
---|---|---|
数据库 (Database) | 数据库 (Database) | 数据的逻辑分组 |
表 (Table) | 集合 (Collection) | 一组文档,类似表但无固定模式 |
行 (Row) | 文档 (Document) | 键值对的集合,类似 JSON 对象 |
列 (Column) | 字段 (Field) | 文档中的一个键值对 |
主键 (Primary Key) | id 字段 (自动生成) | 文档的唯一标识 |
二、常用语句
1. 数据库操作
javascript
// 查看所有数据库
show dbs
// 切换/创建数据库(存在则切换,不存在则创建,插入数据后才会实际创建)
use mydb
// 删除当前数据库
db.dropDatabase()
2. 集合操作
// 创建集合(可选参数指定配置)
db.createCollection("users")
// 查看集合列表
show collections
// 删除集合
db.users.drop()
3. 文档操作(CRUD)
插入文档
// 插入单个文档
db.users.insertOne({
name: "张三",
age: 25,
email: "zhangsan@example.com",
hobbies: ["阅读", "跑步"]
})
// 插入多个文档
db.users.insertMany([
{ name: "李四", age: 30 },
{ name: "王五", age: 22 }
])
查询文档
// 查询所有文档
db.users.find()
// 条件查询(等于)
db.users.find({ age: 25 })
// 条件查询(大于)
db.users.find({ age: { $gt: 25 } })
// 条件查询(逻辑与)
db.users.find({ age: { $gt: 20 }, name: "张三" })
// 条件查询(逻辑或)
db.users.find({ $or: [{ age: 25 }, { name: "李四" }] })
// 投影查询(只返回指定字段)
db.users.find({ name: "张三" }, { name: 1, age: 1, _id: 0 })
// 排序(1升序,-1降序)
db.users.find().sort({ age: 1 })
// 分页(skip跳过,limit限制数量)
db.users.find().skip(10).limit(5)
更新文档
// 更新单个文档(只更新第一个匹配的文档)
db.users.updateOne(
{ name: "张三" }, // 查询条件
{ $set: { age: 26, email: "new@example.com" } } // 更新操作
)
// 更新多个文档
db.users.updateMany(
{ age: { $lt: 30 } },
{ $inc: { age: 1 } } // 原子操作:年龄加1
)
// 替换整个文档(注意:会丢失原文档的其他字段)
db.users.replaceOne(
{ name: "张三" },
{ name: "张三", age: 26, gender: "男" }
)
删除文档
// 删除单个文档(只删除第一个匹配的文档)
db.users.deleteOne({ name: "张三" })
// 删除多个文档
db.users.deleteMany({ age: { $gt: 30 } })
// 删除集合中所有文档(保留集合结构)
db.users.deleteMany({})
4. 索引操作
// 创建单字段索引(升序)
db.users.createIndex({ name: 1 })
// 创建复合索引
db.users.createIndex({ name: 1, age: -1 })
// 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })
// 查看索引
db.users.getIndexes()
// 删除索引
db.users.dropIndex("name_1") // 索引名格式:字段名_排序方向
5. 聚合操作
// 统计文档数量
db.users.countDocuments({ age: { $gt: 25 } })
// 分组统计(统计每个年龄段的人数)
db.users.aggregate([
{ $group: { _id: "$age", count: { $sum: 1 } } }
])
// 筛选+分组+排序(统计年龄>20的用户,按年龄段分组并排序)
db.users.aggregate([
{ $match: { age: { $gt: 20 } } },
{ $group: { _id: "$age", count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
])
三、MongoDB 的使用场景
-
内容管理系统(CMS)
- 灵活的文档结构适合存储各种类型的内容(文章、图片、视频等)
- 支持快速迭代和字段扩展
-
实时分析平台
- 高写入性能处理海量数据
- 聚合框架支持复杂数据分析
-
用户行为日志
- 无模式设计方便记录多变的用户行为数据
- 水平扩展能力应对数据量增长
-
移动应用后端
- 支持地理位置查询(如附近的人 / 地点)
- 自动分片实现高可用和扩展性
-
缓存层
- 高性能读写满足缓存需求
- 灵活的数据模型适配各种缓存场景
-
物联网(IoT)数据存储
- 处理大量结构化和半结构化的传感器数据
- 支持时间序列数据高效存储
四、MongoDB 的优势
-
灵活的文档模型
- 无需预定义模式,字段可动态添加和修改
- 适合快速迭代的开发场景
-
高可扩展性
- 自动分片支持水平扩展
- 副本集提供高可用性和自动故障转移
-
高性能
- 内存映射引擎(WiredTiger)提供高效读写
- 索引支持快速查询
-
丰富的查询功能
- 支持复杂查询、聚合操作和地理位置查询
- 强大的聚合框架替代传统 SQL 的复杂查询
-
地理位置支持
- 内置对地理位置数据的索引和查询支持
- 适合开发 LBS(位置服务)应用
-
易于开发和维护
- JSON 格式数据与现代编程语言和框架无缝集成
- 减少数据转换和映射工作
-
强大的社区支持
- 活跃的开源社区和完善的文档
- 主流云平台(AWS、Azure、Google Cloud)提供官方支持
五、MongoDB 与关系型数据库的对比
特性 | MongoDB (NoSQL) | 关系型数据库 (如 MySQL) |
---|---|---|
数据模型 | 文档模型(JSON/BSON) | 表格模型(固定模式) |
模式灵活性 | 无模式,动态扩展 | 严格模式,修改成本高 |
查询语言 | 类 JSON 查询语法 | SQL |
事务支持 | 4.0 + 支持多文档事务(弱隔离) | 强事务 ACID 保证 |
扩展性 | 水平扩展(自动分片) | 垂直扩展为主 |
适用场景 | 灵活、高并发、大数据量 | 复杂关系、强事务要求 |
六、使用建议
-
避免反模式
- 不要过度嵌套文档(嵌套层级建议不超过 3 层)
- 避免跨集合的复杂查询(MongoDB 不支持 JOIN)
-
合理使用索引
- 为高频查询字段创建索引
- 避免创建过多索引(影响写入性能)
-
设计数据模型
- 基于应用访问模式设计文档结构
- 优先考虑读性能(大多数应用读多写少)
-
监控与优化
- 使用
db.collection.explain()
分析查询性能 - 定期检查慢查询日志(
slowms
参数)
- 使用
-
备份策略
- 使用
mongodump
和mongorestore
进行全量备份 - 结合副本集实现高可用和数据冗余
- 使用