4.1.1 存储->数据库:MongoDB

一、MongoDB 核心定义

  • MongoDB 是一款文档型 NoSQL 数据库,由 MongoDB Inc. 开发,采用 C++ 编写

  • 摒弃了传统关系型数据库的表结构,以BSON(二进制 JSON) 格式存储数据(兼容 JSON,支持更多数据类型如日期、二进制、正则等)

  • 核心特点是「灵活、可扩展、高性能」,适合存储非结构化 / 半结构化数据

二、核心概念(对比关系型数据库)

新手最易混淆的是 MongoDB 与 MySQL 等关系型数据库的概念对应,用表格清晰对比:

MongoDB 概念 关系型数据库(MySQL) 说明
Database Database 数据库(逻辑隔离的数据集)
Collection Table 集合(无需预定义结构的 "表")
Document Row 文档(一条记录,JSON 格式)
Field Column 字段(文档中的键值对)
Index Index 索引(加速查询)
_id Primary Key 文档唯一标识(自动生成,可自定义)

核心差异MongoDB 的 Collection 无需提前定义字段(schema 自由),同集合的文档可以有不同字段 ,比如一个文档有 name/age,另一个可以有 name/email

三、MongoDB 核心特性

  1. 灵活的文档模型:无需预定义表结构,适配快速迭代的业务(如电商、社交),新增字段无需修改整个集合
  2. 高性能
    • 支持内存映射存储,热数据加载到内存,查询速度快;
    • 内置索引(单字段、复合、地理空间、文本索引等),优化查询效率
  3. 高可扩展性
    • 水平扩展:通过「分片(Sharding)」将数据分布到多台服务器,解决大数据量存储
    • 副本集(Replica Set):实现数据备份、故障自动转移,保证高可用
  4. 丰富的查询能力:支持类似 SQL 的查询语法,还能实现聚合、地理空间查询、全文检索等
  5. 事务支持:4.0+ 版本支持多文档事务,4.2+ 支持分布式事务,弥补了早期 NoSQL 事务的短板

四、MongoDB 基本操作(实操篇)

以下是最常用的操作(以 MongoDB Shell 为例,也适配 Python/Java 等驱动),先确保你已安装 MongoDB 并启动服务(mongod 命令),然后进入 Shell(mongomongosh

数据库操作

javascript 复制代码
// 切换/创建数据库(不存在则插入数据时自动创建)
use mydb

// 查看当前数据库
db

// 查看所有数据库
show dbs

// 删除当前数据库
db.dropDatabase()

集合操作

javascript 复制代码
// 创建集合(可选,插入文档时自动创建)
db.createCollection("users")

// 查看所有集合
show collections

// 删除集合
db.users.drop()

文档操作(核心)

1.插入文档

javascript 复制代码
// 插入单条
db.users.insertOne({
  name: "张三",
  age: 25,
  email: "zhangsan@test.com",
  hobbies: ["篮球", "游戏"],
  createTime: new Date()
})

// 插入多条
db.users.insertMany([
  { name: "李四", age: 30, email: "lisi@test.com" },
  { name: "王五", age: 28, email: "wangwu@test.com", isVip: true }
])

2.查询文档

javascript 复制代码
// 查询所有(建议加 limit,避免数据量过大)
db.users.find()  // 原始 BSON 格式
db.users.find().pretty()  // 格式化输出

// 条件查询(等于)
db.users.find({ age: 25 }).pretty()

// 条件查询(大于 $gt、小于 $lt、包含 $in 等)
db.users.find({ age: { $gt: 28 } }).pretty()  // 年龄>28
db.users.find({ hobbies: { $in: ["篮球"] } }).pretty()  // 爱好包含篮球

// 投影(只返回指定字段,_id 默认返回,设为 0 不返回)
db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 }).pretty()

// 排序(1 升序,-1 降序)
db.users.find().sort({ age: -1 }).pretty()

// 分页(skip 跳过,limit 限制条数)
db.users.find().skip(0).limit(2).pretty()  // 第1页,每页2条

// 统计数量
db.users.countDocuments({ age: { $gt: 25 } })

3.更新文档

javascript 复制代码
// 更新单条($set 只修改指定字段,否则覆盖整个文档)
db.users.updateOne(
  { name: "张三" },  // 条件
  { $set: { age: 26, email: "zhangsan_new@test.com" } }  // 修改内容
)

// 更新多条
db.users.updateMany(
  { age: { $lt: 30 } },
  { $inc: { age: 1 } }  // 年龄+1
)

// 替换文档(慎用,会覆盖除 _id 外的所有字段)
db.users.replaceOne(
  { name: "李四" },
  { name: "李四", age: 31, phone: "13800138000" }
)

4.删除文档

javascript 复制代码
// 删除单条
db.users.deleteOne({ name: "王五" })

// 删除多条
db.users.deleteMany({ age: { $lt: 30 } })

// 删除所有
db.users.deleteMany({})

索引操作(优化查询)

javascript 复制代码
// 创建单字段索引(1 升序,-1 降序)
db.users.createIndex({ name: 1 })

// 创建复合索引
db.users.createIndex({ name: 1, age: -1 })

// 查看索引
db.users.getIndexes()

// 删除索引
db.users.dropIndex("name_1")  // 索引名(从 getIndexes 查看)

五、MongoDB 典型应用场景

  1. 大数据量 / 高并发场景:如电商用户行为日志、社交平台动态,MongoDB 高性能读写和水平扩展能力适配这类场景
  2. 数据结构多变的场景:如 IoT 设备数据(不同设备字段不同)、内容管理系统(文章 / 视频属性差异大),无需修改表结构即可适配
  3. 地理空间查询场景:如外卖配送、打车软件的 "附近的商家 / 司机",MongoDB 内置地理空间索引,支持高效的位置查询
  4. 快速迭代的互联网产品:创业公司 / 敏捷开发团队,无需提前设计完整 schema,快速上线并随业务调整数据结构

六、MongoDB 与关系型数据库选型建议

选 MongoDB 选 MySQL/Oracle
数据结构不固定、非结构化 / 半结构化 数据结构固定、强事务、强关联(如金融、电商订单)
大数据量、高读写并发 数据量适中、需复杂 JOIN 查询
快速迭代、灵活扩展 业务稳定、需严格的 ACID 事务

总结

  1. MongoDB 是文档型 NoSQL 数据库以 BSON 存储数据,核心优势是灵活、高性能、易扩展,无需预定义 schema
  2. 核心操作围绕「数据库 - 集合 - 文档」三层结构 ,常用 API 包括 insertOne/ManyfindupdateOne/ManydeleteOne/Many
  3. 选型时优先看==数据结构是否固定、是否需要强事务 / 关联查询:非结构化 / 高并发选 MongoDB,结构化 / 强事务选关系型数据库==
相关推荐
JZC_xiaozhong2 小时前
ERP与MES制造数据同步:痛点破解与高效落地实践
大数据·数据库·制造·数据传输·数据孤岛解决方案·数据集成与应用集成·异构数据整合
尽兴-2 小时前
超越缓存:Redis Stack 如何将 Redis 打造成全能实时数据平台
数据库·redis·缓存·redis stack
一个有温度的技术博主2 小时前
Redis系列七:Java客户端Jedis的入门
java·数据库·redis
枕布响丸辣2 小时前
【无标题】
数据库·oracle
Cory.眼2 小时前
MySQL语法错误与修正指南
数据库·sql·oracle
LSL666_2 小时前
Redis值数据类型——sorted set
数据库·redis·缓存·数据类型
supericeice2 小时前
GraphRAG 和 RAG 的区别:企业知识问答什么时候该升级到 GraphRAG
数据库·知识图谱·rag·graphrag
菜菜小狗的学习笔记2 小时前
黑马程序员Redis--基础篇
数据库·redis·缓存
是桃萌萌鸭~2 小时前
Oracle参数db_unique_name详解
数据库·sql·oracle·database