Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 时序数据库
  • Postgres
  • MongoDB入门与实践
    • 前言
    • 什么是MongoDB
    • MongoDB与关系型数据库的对比
    • MongoDB的核心概念
      • 数据库
      • 集合
      • 文档
      • BSON
    • MongoDB的安装与启动
      • 在Linux上安装MongoDB
      • 启动MongoDB服务
      • 连接到MongoDB
    • MongoDB基本操作
      • 创建数据库
      • 插入文档
      • 查询文档
      • 更新文档
      • 删除文档
    • MongoDB的高级特性
      • 索引
      • 聚合
      • 事务
    • MongoDB的应用场景
    • MongoDB性能优化
      • 硬件选择
      • 配置优化
      • 查询优化
    • MongoDB的安全实践
      • 身份验证
      • 网络安全
      • 数据加密
    • MongoDB的生态系统
      • MongoDB Compass
      • MongoDB Atlas
      • MongoDB驱动
      • 示例:使用Node.js连接MongoDB
    • 结语
  • NewSQL数据库:关系型与NoSQL的完美结合
  • Redis入门与实践:高性能键值数据库指南
  • Redis入门与实践
  • SQL基础:关系型数据库的语言
  • 关系型数据库基础
  • 关系型数据库基础与SQL入门
  • 关系型数据库基础理论
  • 关系数据库设计与SQL基础
  • 数据库分类与选型指南
  • 数据库性能优化与调优实战指南
  • 数据库索引与性能优化
  • 数据库索引原理与优化
  • 数据库设计与数据建模:从概念到实践
  • 数据库事务与并发控制:保证数据一致性的核心技术
  • 数据库事务与并发控制:保证数据一致性的核心机制
  • 数据库安全与权限管理-保护数据的基石
  • 数据库备份与恢复策略-确保数据安全的最后一道防线
  • 数据库分布式架构:从CAP理论到分片策略的全面解析
  • 数据库监控与运维-确保数据库健康运行的守护者
  • 数据库高可用方案-构建永不掉线的数据库架构
  • 数据库连接池技术:提升应用性能的关键组件
  • 数据库查询优化与执行计划分析-提升SQL性能的关键技术
  • 数据库迁移策略:平滑过渡的关键步骤与技术实现
  • 数据库缓存策略:提升系统性能的关键武器
  • 数据库性能问题诊断与排查-从现象到根源的系统化方法
  • 数据库版本管理与演进-构建平滑升级的技术路径
  • 数据库分片与分布式数据管理-构建可扩展数据架构的核心技术
  • 数据库云服务与托管解决方案-构建现代化数据架构的必经之路
  • database
Jorgen
2023-11-15
目录

MongoDB入门与实践

# 前言

在当今的数据驱动世界中,选择合适的数据库对于应用的成功至关重要。随着数据类型和应用的多样化,传统的关系型数据库已无法满足所有场景的需求。NoSQL数据库应运而生,为处理非结构化数据和构建可扩展应用提供了新的解决方案。

在众多NoSQL数据库中,MongoDB凭借其灵活的文档模型、强大的查询能力和良好的生态系统,成为了最受欢迎的选择之一。本文将带你走进MongoDB的世界,了解它的核心概念、特点以及如何在实践中应用。

# 什么是MongoDB

MongoDB是一个开源的、文档型的NoSQL数据库,由C++编写。它由MongoDB Inc.开发并维护,采用分布式文件存储的方式存储数据。

与传统的关系型数据库不同,MongoDB使用BSON(Binary JSON)格式存储文档,这种格式类似于JSON但支持更多数据类型。每个文档都有一个唯一的_id字段作为主键。

MongoDB核心特点

  • 文档存储:数据以文档形式存储,类似于JSON对象
  • 动态模式:集合中的文档不需要有相同的结构
  • 丰富的查询语言:支持复杂的查询、聚合和地理空间查询
  • 水平扩展:支持分片集群,可轻松扩展到多台机器
  • 高可用性:支持复制集,提供数据冗余和故障转移

# MongoDB与关系型数据库的对比

为了更好地理解MongoDB的优势,让我们将它与传统的关系型数据库进行对比:

特性 MongoDB (文档型) 关系型数据库 (如MySQL)
数据模型 文档(BSON) 表(行和列)
模式 灵活,动态 固定,预定义
查询语言 MongoDB查询语言 SQL
关系 通过引用或嵌入实现 外键约束
扩展性 水平扩展(分片) 垂直扩展
事务支持 4.0版本后支持多文档事务 ACID事务
适用场景 非结构化数据、快速迭代、内容管理 结构化数据、强一致性要求

# MongoDB的核心概念

# 数据库

MongoDB中的数据库是一组集合的容器,类似于关系型数据库中的数据库。

# 集合

集合是一组文档的容器,类似于关系型数据库中的表。集合没有固定的结构,可以存储不同字段的文档。

# 文档

文档是MongoDB中的基本数据单元,由字段和值对组成,类似于JSON对象。每个文档都有一个唯一的_id字段。

# BSON

BSON(Binary JSON)是MongoDB使用的数据格式,它是JSON的二进制表示形式,支持更多数据类型,如日期、二进制数据等。

# MongoDB的安装与启动

# 在Linux上安装MongoDB

# 导入MongoDB公共密钥
wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -

# 添加MongoDB到APT仓库
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list

# 更新包列表
sudo apt-get update

# 安装MongoDB
sudo apt-get install -y mongodb-org
1
2
3
4
5
6
7
8
9
10
11

# 启动MongoDB服务

# 启动MongoDB服务
sudo systemctl start mongod

# 检查MongoDB服务状态
sudo systemctl status mongod

# 设置MongoDB开机自启
sudo systemctl enable mongod
1
2
3
4
5
6
7
8

# 连接到MongoDB

# 连接到MongoDB shell
mongosh
1
2

# MongoDB基本操作

# 创建数据库

在MongoDB中,当你第一次插入一个文档时,数据库和集合会被自动创建。

# 切换到或创建myDatabase数据库
use myDatabase

# 插入一个文档,这将自动创建集合
db.myCollection.insertOne({ name: "张三", age: 30, city: "北京" })
1
2
3
4
5

# 插入文档

# 插入单个文档
db.users.insertOne({
  name: "李四",
  age: 25,
  hobbies: ["阅读", "旅行", "摄影"],
  address: {
    city: "上海",
    district: "浦东"
  }
})

# 插入多个文档
db.users.insertMany([
  { name: "王五", age: 28, city: "广州" },
  { name: "赵六", age: 32, city: "深圳" }
])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 查询文档

# 查询所有文档
db.users.find()

# 格式化输出
db.users.find().pretty()

# 条件查询
db.users.find({ age: { $gt: 25 } })  # 查询年龄大于25的用户

# 投影查询(只返回特定字段)
db.users.find({}, { name: 1, age: 1, _id: 0 })
1
2
3
4
5
6
7
8
9
10
11

# 更新文档

# 更新单个文档
db.users.updateOne(
  { name: "张三" },
  { $set: { age: 31 } }
)

# 更新多个文档
db.users.updateMany(
  { age: { $lt: 30 } },
  { $set: { status: "young" } }
)
1
2
3
4
5
6
7
8
9
10
11

# 删除文档

# 删除单个文档
db.users.deleteOne({ name: "赵六" })

# 删除多个文档
db.users.deleteMany({ age: { $lt: 25 } })

# 删除整个集合
db.users.drop()

# 删除当前数据库
db.dropDatabase()
1
2
3
4
5
6
7
8
9
10
11

# MongoDB的高级特性

# 索引

索引可以显著提高查询性能。MongoDB支持多种类型的索引:

# 创建单字段索引
db.users.createIndex({ name: 1 })

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

# 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true })

# 查看集合的索引
db.users.getIndexes()
1
2
3
4
5
6
7
8
9
10
11

# 聚合

聚合管道是MongoDB强大的数据处理工具,可以对文档进行多阶段的处理:

# 聚合示例:按城市分组并统计每个城市的用户数量
db.users.aggregate([
  { $group: { _id: "$city", count: { $sum: 1 } } },
  { $sort: { count: -1 } }
])
1
2
3
4
5

# 事务

MongoDB 4.0引入了多文档事务支持:

# 开始会话
const session = db.getMongo().startSession()

try {
  # 开始事务
  session.startTransaction()
  
  # 在事务中执行操作
  db.accounts.updateOne(
    { _id: 1 },
    { $inc: { balance: -100 } },
    { session }
  )
  
  db.accounts.updateOne(
    { _id: 2 },
    { $inc: { balance: 100 } },
    { session }
  )
  
  # 提交事务
  session.commitTransaction()
} catch (error) {
  # 回滚事务
  session.abortTransaction()
  throw error
} finally {
  # 结束会话
  session.endSession()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# MongoDB的应用场景

MongoDB适合以下场景:

  1. 内容管理系统:灵活的数据模型适合存储各种类型的内容
  2. 用户画像系统:可以轻松存储和查询用户的各种属性和行为
  3. 物联网数据存储:可以高效处理大量设备产生的时序数据
  4. 实时分析:聚合管道支持复杂的数据分析
  5. 移动应用后端:JSON数据格式与移动应用天然匹配
  6. 日志存储:可以高效存储和查询大量日志数据

# MongoDB性能优化

# 硬件选择

  • 内存:MongoDB heavily依赖内存来缓存数据,建议使用足够大的RAM
  • 磁盘:SSD可以显著提高性能,特别是对于随机读写操作
  • CPU:多核CPU有助于处理并发请求

# 配置优化

# /etc/mongod.conf 示例配置
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  engine: "wiredTiger"
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2  # 根据可用内存调整
net:
  port: 27017
  bindIp: 127.0.0.1
operationProfiling:
  slowOpThresholdMs: 100
  mode: all
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 查询优化

  • 使用适当的索引
  • 避免全表扫描
  • 只查询需要的字段
  • 使用投影减少数据传输量

# MongoDB的安全实践

# 身份验证

# 创建管理员用户
use admin
db.createUser({
  user: "admin",
  pwd: "securepassword",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

# 启用身份验证
# 修改mongod.conf,添加以下内容
security:
  authorization: enabled
1
2
3
4
5
6
7
8
9
10
11
12

# 网络安全

  • 使用防火墙限制MongoDB端口访问
  • 使用SSL/TLS加密连接
  • 禁用不必要的网络接口

# 数据加密

  • 启用WiredTiger加密
  • 使用文件系统级加密

# MongoDB的生态系统

# MongoDB Compass

MongoDB Compass是官方的图形化管理工具,提供直观的界面来查询、聚合和可视化数据。

# MongoDB Atlas

MongoDB Atlas是MongoDB的云托管服务,提供自动化的部署、扩展和管理。

# MongoDB驱动

MongoDB为多种编程语言提供了官方驱动,包括:

  • Node.js
  • Python
  • Java
  • C#
  • Ruby
  • PHP
  • Go
  • 等

# 示例:使用Node.js连接MongoDB

// 安装MongoDB Node.js驱动
npm install mongodb

// 使用示例
const { MongoClient } = require('mongodb');

async function main() {
  const uri = "mongodb://localhost:27017";
  const client = new MongoClient(uri);
  
  try {
    await client.connect();
    const database = client.db('myDatabase');
    const users = database.collection('users');
    
    // 插入文档
    const newUser = { name: "测试用户", age: 28 };
    const result = await users.insertOne(newUser);
    console.log(`插入文档,ID: ${result.insertedId}`);
    
    // 查询文档
    const query = { age: { $gte: 25 } };
    const foundUsers = await users.find(query).toArray();
    console.log("找到的用户:", foundUsers);
  } finally {
    await client.close();
  }
}

main().catch(console.error);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 结语

MongoDB作为NoSQL数据库的代表之一,以其灵活的文档模型、强大的查询能力和良好的扩展性,在现代应用开发中扮演着越来越重要的角色。无论是构建快速迭代的应用、处理非结构化数据,还是需要高可扩展性的系统,MongoDB都能提供有力的支持。

通过本文的介绍,我们了解了MongoDB的基本概念、核心特性、操作方法以及最佳实践。当然,MongoDB的世界远不止这些,还有更多高级特性和优化技巧等待探索。

如果你正在考虑为你的项目选择数据库,不妨给MongoDB一个机会。它可能会为你的开发带来意想不到的便利和效率提升。

"选择合适的工具,是解决问题的第一步。MongoDB为我们提供了一种全新的数据存储和访问方式,让我们的应用更加灵活和强大。"


如果你对MongoDB有任何疑问或想要分享使用经验,欢迎在评论区留言交流!

#MongoDB#NoSQL#数据库
上次更新: 2026/01/28, 14:21:05
Postgres
NewSQL数据库:关系型与NoSQL的完美结合

← Postgres NewSQL数据库:关系型与NoSQL的完美结合→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式