MongoDB 新手笔记

MongoDB 新手笔记


1. MongoDB

1.1 概述

MongoDB 是一种 文档型数据库(NoSQL),数据以类似 JSON 的 BSON 格式存储,适合处理非结构化或半结构化数据。

  • 对比 MySQL
    • MySQL 是关系型数据库,数据以表格形式存储(行和列)。
    • MongoDB 以集合(Collection)和文档(Document)形式存储数据,更灵活。

1.2 特点

  • 灵活模式:字段可动态添加,无需预定义表结构。
  • 高性能:支持索引、内存映射文件,读写速度快。
  • 水平扩展:通过分片(Sharding)实现数据分布式存储。

1.3 体系结构

  • 数据库(Database) → 类似 MySQL 的数据库。
  • 集合(Collection) → 类似 MySQL 的表。
  • 文档(Document) → 类似 MySQL 的一行记录,但以 BSON 格式存储。

2. 安装与启动

2.1 安装

从官网下载安装包,按操作系统步骤安装。

  • Linux 示例

    bash 复制代码
    sudo apt-get install mongodb

2.2 启动

2.2.1 创建数据目录
bash 复制代码
mkdir -p /data/db  # 默认数据存储路径
2.2.2 编写启动脚本
bash 复制代码
mongod --dbpath=/data/db  # 启动 MongoDB 服务

2.3 连接

使用 MongoDB Shell 连接:

bash 复制代码
mongo  # 默认连接本地服务

3. 基本操作

3.1 选择或创建数据库

javascript 复制代码
use mydb  // 切换到 mydb,若不存在则自动创建

3.2 新增

向集合插入文档(类似 MySQL 的 INSERT):(对当前数据库操作统一使用db,而不是当前的数据库名)

javascript 复制代码
db.users.insertOne({ name: "张三", age: 25 })  // 插入单条
db.users.insertMany([{ name: "李四" }, { name: "王五" }])  // 插入多条

3.3 查询

3.3.1 查询全部文档(类似 SELECT *)
javascript 复制代码
db.users.find()  
3.3.2 条件查询(类似 WHERE)
javascript 复制代码
db.users.find({ age: 25 })  // 查询 age=25 的文档
3.3.3 查询第一条(类似 LIMIT 1)
javascript 复制代码
db.users.findOne()  

3.4 更新(类似 UPDATE)

javascript 复制代码
db.users.updateOne(
  { name: "张三" },  // 条件
  { $set: { age: 30 } }  // 更新操作
)

3.5 删除

3.5.1 删除文档(类似 DELETE)
javascript 复制代码
db.users.deleteOne({ name: "张三" })  
3.5.2 删除集合(类似 DROP TABLE)
javascript 复制代码
db.users.drop()  
3.5.3 删除数据库
javascript 复制代码
db.dropDatabase()  

4. 高级查询

4.1 准备数据

javascript 复制代码
db.products.insertMany([
  { name: "手机", price: 3000, stock: 100 },
  { name: "电脑", price: 8000, stock: null },
  { name: "耳机", price: 200 }
])

4.2 模糊查询(类似 LIKE)

javascript 复制代码
db.products.find({ name: /手/ })  // 正则表达式匹配

4.3 null 值处理

javascript 复制代码
db.products.find({ stock: null })  // 查询 stock 为 null 或不存在

4.4 比较运算(如 >, <)

javascript 复制代码
db.products.find({ price: { $gt: 2000 } })  // price > 2000

4.5 判断属性是否存在

javascript 复制代码
db.products.find({ stock: { $exists: true } })  // 查询包含 stock 字段的文档

4.6 包含与不包含(类似 IN)

javascript 复制代码
db.products.find({ name: { $in: ["手机", "耳机"] } })  // 包含指定值

4.7 统计记录数(类似 COUNT)

javascript 复制代码
db.products.countDocuments({ price: { $gt: 2000 } })

4.8 条件连接(AND/OR)

javascript 复制代码
db.products.find({
  $and: [
    { price: { $gt: 1000 } },
    { price: { $lt: 5000 } }
  ]
})
// g:great
// l:less

总结

  1. MongoDB vs MySQL
    • 数据模型:文档 vs 表格。
    • 查询语法:JSON 式操作 vs SQL 语句。
    • 扩展性:水平扩展 vs 垂直扩展。
  2. 核心操作
    • 增删改查通过 insertdeleteupdatefind 实现。
    • 高级查询支持正则、比较运算符、逻辑连接等。
  3. 适用场景
    • MongoDB:大数据量、高并发、灵活模式需求。
    • MySQL:事务强一致性、复杂关联查询。
对比项 MongoDB MySQL
数据库类型 文档型数据库(NoSQL) 关系型数据库(SQL)
数据模型 以 BSON(类似 JSON)格式存储文档 以表格(行和列)形式存储数据
术语对比
- 数据库 Database Database
- 表/集合 Collection Table
- 行 Document(文档,BSON 格式) Row(行)
- 列 Field(字段) Column(列)
- 主键 _id(自动生成,可自定义) PRIMARY KEY(需显式定义)
查询语法
- 查询数据 db.collection.find({条件}) SELECT * FROM table WHERE 条件
- 插入数据 db.collection.insertOne({文档}) INSERT INTO table (列) VALUES (值)
- 更新数据 db.collection.updateOne({条件}, {$set: {字段: 值}}) UPDATE table SET 列=值 WHERE 条件
- 删除数据 db.collection.deleteOne({条件}) DELETE FROM table WHERE 条件
- 条件查询 { age: { $gt: 20 } }(使用操作符如 $gt, $lt WHERE age > 20
- 模糊查询 db.collection.find({ name: /正则表达式/ }) WHERE name LIKE '%关键字%'
事务支持 4.0+ 版本支持多文档事务(默认需手动配置) 原生支持 ACID 事务(如 BEGIN; COMMIT; ROLLBACK;
关联查询 不支持 JOIN,需通过嵌入文档或应用层代码实现 支持 JOIN(如 INNER JOIN, LEFT JOIN
索引机制 支持单字段、复合、地理空间、文本索引等 支持 B-Tree、哈希、全文索引等
扩展性 水平扩展(分片集群) 垂直扩展(提升硬件性能)
数据模式 动态模式(Schema-less),字段可灵活增减 静态模式(Schema),需预先定义表结构
性能特点 适合高并发读写、海量非结构化数据 适合复杂查询、事务密集型场景
存储引擎 WiredTiger(默认,支持压缩和加密) InnoDB(默认,支持事务和行级锁)
适用场景 日志系统、实时分析、内容管理、物联网(IoT) 金融系统、ERP、CRM 等需要强一致性和复杂事务的场景
典型操作符对比
- 等于 { age: 25 } WHERE age = 25
- 包含 { tags: { $in: ["A", "B"] } } WHERE tag IN ("A", "B")
- 逻辑与/或 $and: [条件1, 条件2] / $or: [条件1, 条件2] WHERE 条件1 AND 条件2 / WHERE 条件1 OR 条件2
- 统计记录数 db.collection.countDocuments({条件}) SELECT COUNT(*) FROM table WHERE 条件
数据一致性 最终一致性(分布式场景) 强一致性(单机或主从复制)
典型缺点 不支持复杂关联查询,事务实现较复杂 扩展性受限,处理非结构化数据效率低

总结

  1. 术语差异:MongoDB 的"文档"对应 MySQL 的"行","集合"对应"表","字段"对应"列"。
  2. 语法差异
    • MongoDB 使用 JSON 风格的查询语法(如 find({条件})),而 MySQL 使用标准 SQL 语句。
    • MongoDB 通过操作符(如 $gt, $in)实现复杂条件,MySQL 直接使用运算符(如 >, IN)。
  3. 核心特性
    • MongoDB 灵活、易扩展,适合非结构化数据;
    • MySQL 强事务、强一致性,适合结构化数据和复杂查询。
  4. 选择建议
    • 用 MongoDB:需要快速迭代、处理海量数据或半结构化数据(如日志、用户行为)。
    • 用 MySQL:需要强事务支持、复杂关联查询(如金融系统)。

重点口诀:灵活用 Mongo,事务用 MySQL;文档即 JSON,查询靠 BSON!

相关推荐
tt5555555555555 分钟前
python文件打包无法导入ultralytics模块
开发语言·pytorch·笔记·python
萨达大12 分钟前
软考高级-系统架构设计师 案例题-数据库系统
数据库·oracle·系统架构·软考高级·orm
八股文领域大手子44 分钟前
《从单体到分布式:一个订单系统的架构升级》
java·数据库·spring·缓存·mybatis
cmc10281 小时前
71.case语句要比if-else 语句费逻辑单元
笔记
江沉晚呤时1 小时前
深入探析C#设计模式:访问者模式(Visitor Pattern)的原理与应用
java·服务器·开发语言·数据库·.netcore
丰锋ff2 小时前
考研单词笔记 2025.04.12
笔记
老大白菜2 小时前
mysql 商城商品属性开发的动态解决方案
数据库·mysql
tpoog2 小时前
[MySQL] 表的增删查改(查询是重点)
linux·数据库·mysql·算法·贪心算法
碣石潇湘无限路2 小时前
【技术】Ruby 生态概念速查表,通过对比nodejs生态(入门)
开发语言·经验分享·笔记·后端·node.js·ruby
博睿谷IT99_3 小时前
2025年考OCP认证有用吗?
数据库·oracle·开闭原则·ocp认证·程序员人生