Mongodb数据库应用

Mongodb数据库应用

MongoDB 是一款开源的文档型非关系型数据库(NoSQL),它打破了传统关系型数据库的表结构模式,以灵活的文档形式存储数据,特别适合处理非结构化和半结构化数据。以下从多个维度详细解析 MongoDB 的核心特性、应用场景及优势:

一、核心概念与数据模型

  1. 文档(Document)

    • 数据的基本存储单元,类似 JSON 格式,但使用 BSON(Binary JSON)存储,支持更丰富的数据类型(如日期、二进制、数组等)。

    • 示例:

      {
        "_id": "user123",
        "name": "张三",
        "age": 30,
        "hobbies": ["阅读", "跑步"],
        "address": { "city": "北京", "district": "朝阳区" }
      }
      
  2. 集合(Collection)

    • 文档的容器,类似关系型数据库中的 “表”,但集合内的文档无需遵循统一结构(字段可动态增减)。
    • 例如:users集合中可同时存储不同字段的用户文档,如部分文档包含"email"字段,部分不包含。
  3. 数据库(Database)

    • 集合的容器,可包含多个集合,如blog数据库中可能有articles(文章)和comments(评论)集合。
数据模型与结构

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

MongoDB 概念关系型数据库对应概念
数据库(Database)数据库
集合(Collection)表(Table)
文档(Document)行(Row)
字段(Field)列(Column)
索引(Index)索引(Index)

二、核心特性与优势

  1. 灵活的数据结构

    • 无需预定义表结构,数据字段可动态调整,适合业务快速迭代(如电商商品属性频繁变更)。
    • 对比:传统 MySQL 需通过 ALTER TABLE 修改表结构,过程繁琐且可能影响业务。
  2. 高并发与水平扩展能力

    • 分片(Sharding):将数据分散到多个服务器(分片节点),支持 TB 级数据存储和百万级并发读写。
    • 复制集(Replica Set):通过主从复制实现高可用性,主节点故障时自动切换从节点,保证服务不中断。
  3. 丰富的查询能力

    • 支持类似 SQL 的复杂查询,如条件查询、排序、聚合(分组统计、平均值计算等),甚至可通过正则表达式匹配文本。

    • 示例:查询年龄大于 30 且居住在北京的用户

      db.users.find({ age: { $gt: 30 }, "address.city": "北京" })
      
  4. 原生支持 JSON 与聚合操作

    • 直接存储和查询 JSON 格式数据,无需转换;内置聚合框架(Aggregation Pipeline)可高效处理复杂数据分析任务(如电商订单统计)。

三、典型应用场景

  1. 内容管理与动态数据
    • 场景:新闻网站、博客平台、CMS 系统(如 WordPress)。
    • 优势:文章内容(标题、正文、标签)结构灵活,可随时添加新字段(如 “阅读量”“点赞数”)。
  2. 用户行为与日志数据
    • 场景:APP 用户操作记录(浏览、点击、下单)、网站访问日志。
    • 案例:腾讯微信通过 MongoDB 存储用户聊天记录和动态数据,支持海量非结构化数据的实时写入。
  3. 实时数据统计与分析
    • 场景:电商平台的商品浏览量统计、直播平台的观众互动数据。
    • 优势:通过聚合操作快速计算实时指标(如某商品近 1 小时的点击量),无需复杂的 JOIN 操作。
  4. 移动应用与 IoT 设备数据
    • 场景:智能家居设备的状态数据(温度、湿度)、移动 APP 的用户偏好设置。
    • 案例:小米 IoT 平台使用 MongoDB 存储设备上报的实时数据,支持千万级设备的并发接入。

四、与关系型数据库的对比

维度MongoDB(NoSQL)MySQL(SQL)
数据结构文档(JSON/BSON),灵活无模式表结构固定,需预定义字段
事务支持支持单文档事务,多文档事务需手动协调完整支持 ACID 事务(如转账操作)
扩展性水平扩展(分片)简单,适合海量数据水平扩展复杂,需分库分表等方案
查询性能非结构化数据查询效率高结构化数据 JOIN 查询性能更优
适用场景快速迭代、非结构化数据、高并发场景强事务性、数据结构固定的场景

五、MongoDB 的生态与工具

  1. 开发语言支持
    • 原生驱动支持 Python、Java、Node.js、Go 等主流语言,适配各类开发框架(如 Django、Spring Boot)。
  2. 管理与可视化工具
    • MongoDB Compass:官方可视化工具,支持图形化查询和数据管理。
    • Robo 3T:第三方跨平台工具,功能丰富且轻量。
  3. 云服务与托管
    • MongoDB Atlas:官方云数据库服务,支持一键部署、自动备份和监控,兼容 AWS、Azure、GCP。
    • 国内云厂商:阿里云 MongoDB、腾讯云 MongoDB,提供国产化适配和本地化服务。

六、使用注意事项

  1. 数据量大时的性能优化
    • 合理创建索引(如对高频查询字段user_idtimestamp建立索引),但索引过多会影响写入性能。
  2. 事务与一致性权衡
    • 若业务需要强一致性(如金融转账),建议结合 MySQL 等关系型数据库使用,或利用 MongoDB 的多文档事务(4.0 + 版本支持,但性能开销较大)。
  3. 存储成本
    • 文档型存储可能比关系型数据库占用更多空间(如重复存储关联数据),需通过数据压缩(BSON 默认压缩)或合理设计文档结构降低成本。

七,示例

7.1安装Mongodb
# 安装MongoDB依赖库(libcurl用于网络通信,openssl用于加密)
[root@localhost ~]# dnf -y install libcurl openssl 

# 列出当前目录文件,确认安装包存在
[root@localhost ~]# ls
 mongodb-database-tools-rhel70-x86_64-100.12.0.rpm     openssl-1.1.1w.tar.gz
 mongodb-linux-x86_64-rhel8-8.0.8.tgz                  mongosh-2.5.0-linux-x64-openssl3.tgz

# 解压MongoDB官方安装包
[root@localhost ~]# tar xf mongodb-linux-x86_64-rhel8-8.0.8.tgz 

# 将解压后的目录移动到标准安装位置(/usr/local/通常用于用户自行安装的软件)
[root@localhost ~]# mv mongodb-linux-x86_64-rhel88-8.0.8  /usr/local/mongodb

# 将MongoDB命令添加到系统PATH环境变量(确保全局可调用)
[root@localhost ~]# echo "export PATH=/usr/local/mongodb/bin:$PATH" >> /etc/profile

# 立即生效环境变量修改
[root@localhost ~]# source /etc/profile

# 创建MongoDB数据存储目录(默认配置下MongoDB将在此存储数据文件)
[root@localhost ~]# mkdir -p /var/lib/mongo

# 创建MongoDB日志目录(存储运行日志)
[root@localhost ~]# mkdir -p /var/log/mongodb

# 安装编译工具(gcc用于编译C代码,perl用于脚本处理)
[root@localhost ~]# dnf -y install gcc perl

# 解压OpenSSL源码包(MongoDB可能需要特定版本的OpenSSL支持)
[root@localhost ~]# tar xf openssl-1.1.1w.tar.gz 

# 配置OpenSSL编译选项,指定安装路径为/opt/openssl11
[root@localhost openssl-1.1.1w]# ./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl

# 查看系统CPU核心数(用于并行编译,提高编译速度)
[root@localhost openssl-1.1.1w]# nproc

# 使用2个线程并行编译OpenSSL(根据nproc输出结果设置)
[root@localhost openssl-1.1.1w]# make -j2

# 安装OpenSSL到指定目录
[root@localhost openssl-1.1.1w]# make install

# 切换到OpenSSL安装目录查看文件结构
[root@localhost ~]# cd /opt/openssl11/
[root@localhost openssl11]# ls
bin  include  lib  share  ssl

# 在环境变量中添加OpenSSL库路径(确保系统能找到自定义安装的OpenSSL库)
[root@localhost openssl11]# vim /etc/profile
export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH

# 立即生效环境变量修改
[root@localhost openssl11]# source /etc/profile

# 启动MongoDB服务(后台模式运行)
# --dbpath:指定数据存储路径
# --logpath:指定日志文件路径
# --fork:以守护进程方式后台运行
[root@localhost ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

# 输出服务启动成功信息:
# about to fork child process, waiting until server is ready for connections.
# forked process: 19640
# child process started successfully, parent exiting


# 解压MongoDB Shell官方安装包(基于x64架构和OpenSSL 3)
[root@localhost ~]# tar xf mongosh-2.5.0-linux-x64-openssl3.tgz 

# 进入解压后的目录
[root@localhost ~]# cd mongosh-2.5.0-linux-x64-openssl3

# 查看目录内容(包含可执行文件、许可证和文档)
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# ls
bin  LICENSE-crypt-library  LICENSE-mongosh  mongosh.1.gz  README  THIRD_PARTY_NOTICES

# 进入二进制文件目录(包含可执行程序)
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# cd bin/

# 将MongoDB Shell主程序复制到系统可执行路径(确保全局可调用)
[root@localhost bin]# cp mongosh /usr/local/bin/

# 将加密库(用于数据传输加密)复制到系统可执行路径
[root@localhost bin]# cp mongosh_crypt_v1.so /usr/local/bin/

# 验证安装:执行mongosh命令连接MongoDB(需MongoDB服务已启动)
# 若MongoDB运行在默认端口且无需认证,可直接连接
[root@localhost bin]# mongosh  ##进入Mongodb

关键步骤说明:

  1. 环境准备:安装必要依赖库(libcurl/openssl)和编译工具(gcc/perl)
  2. MongoDB 安装:解压官方包并配置系统环境变量
  3. 数据与日志目录:创建标准的存储路径(符合 Linux FHS 规范)
  4. OpenSSL 编译:从源码编译特定版本 OpenSSL 并安装到非标准路径
  5. 服务启动:使用自定义参数启动 MongoDB 服务,指定数据和日志位置

八,Mongodb常见操作

1、数据库与集合操作
1.1连接与切换数据库
# 连接本地默认实例
mongosh

# 连接指定主机和端口
mongosh "mongodb://localhost:27017"

# 切换/创建数据库(不存在时自动创建,插入数据后才实际生成)
use mydb
#查看当前所在的数据库
#输入/  
test> db
#返回 /
test
1.2集合管理
// 创建集合(显式创建,可选配置参数)
db.createCollection("users", { capped: false, size: 1000000 })

// 查看所有集合
db.getCollectionNames()  // 旧版语法
show collections         // 简化语法

// 删除集合
db.users.drop()
2、文档操作(CRUD)
2.1插入文档
// 插入单条文档(自动生成_id)
db.users.insertOne({
  name: "Alice",
  age: 30,
  hobbies: ["reading", "coding"],
  address: { city: "New York", zip: "10001" }
})

// 批量插入(高效,自动生成多个文档)
db.users.insertMany([
  { name: "Bob", age: 25 },
  { name: "Charlie", age: 35 }
])
2. 2查询文档
// 查询所有文档(返回游标,需迭代或使用toArray())
db.users.find()

// 带条件查询(查询age>30的文档)
db.users.find({ age: { $gt: 30 } })

// 精确匹配(AND逻辑)
db.users.find({ name: "Alice", city: "New York" })

// 使用OR操作符
db.users.find({ $or: [{ age: 25 }, { name: "Charlie" }] })

// 投影(指定返回字段,0表示排除,1表示包含)
db.users.find({ name: "Alice" }, { name: 1, age: 1, _id: 0 })
2.3更新文档
// 更新单条文档(仅修改指定字段,保留其他字段)
db.users.updateOne(
  { name: "Alice" },  // 查询条件
  { $set: { age: 31, hobbies: ["reading", "swimming"] } }  // 更新操作
)

// 批量更新(将所有age>30的文档的status设为"active")
db.users.updateMany(
  { age: { $gt: 30 } },
  { $set: { status: "active" } }
)

// 替换整个文档(注意:会丢失原文档中未包含的字段)
db.users.replaceOne(
  { name: "Bob" },
  { name: "Robert", age: 26, job: "engineer" }
)
2.4 删除文档
// 删除单条匹配文档
db.users.deleteOne({ name: "Charlie" })

// 批量删除(删除所有age<20的文档)
db.users.deleteMany({ age: { $lt: 20 } })

// 清空集合(效率高于deleteMany({}))
db.users.drop()
3、索引操作
// 创建单字段索引(升序1,降序-1)
db.users.createIndex({ name: 1 })

// 创建复合索引(按组合字段排序)
db.users.createIndex({ age: 1, city: -1 })

// 创建唯一索引(确保字段值不重复)
db.users.createIndex({ email: 1 }, { unique: true })

// 查看集合所有索引
db.users.getIndexes()

// 删除索引
db.users.dropIndex("name_1")  // 索引名(默认格式:字段名_排序方向)
4、聚合框架(复杂数据分析)
// 示例:统计各城市用户数量并按数量降序排列
db.users.aggregate([
  { $match: { status: "active" } },  // 筛选活跃用户
  { $group: { _id: "$city", count: { $sum: 1 } } },  // 按城市分组计数
  { $sort: { count: -1 } }  // 降序排列
])

// 示例:计算平均年龄并添加新字段
db.users.aggregate([
  { $group: { _id: null, avgAge: { $avg: "$age" } } },  // 计算平均年龄
  { $project: { _id: 0, average_age: "$avgAge" } }  // 重命名输出字段
])
5、高级查询操作符
5.1比较操作符
操作符含义示例
$eq等于{ age: { $eq: 30 } }
$ne不等于{ age: { $ne: 30 } }
$gt大于{ age: { $gt: 30 } }
$gte大于等于{ age: { $gte: 30 } }
$lt小于{ age: { $lt: 30 } }
$lte小于等于{ age: { $lte: 30 } }
$in在指定数组中{ age: { $in: [25, 30] } }
$nin不在指定数组中{ age: { $nin: [25, 30] } }
5.2 逻辑操作符
操作符含义示例
$and逻辑与{ $and: [{ age: 30 }, { city: "New York" }] }
$or逻辑或{ $or: [{ age: 30 }, { name: "Alice" }] }
$not逻辑非{ age: { $not: { $gt: 30 } } }
$nor所有条件不满足{ $nor: [{ age: 30 }, { city: "LA" }] }
5.3 元素操作符
操作符含义示例
$exists字段存在{ email: { $exists: true } }
$type字段类型匹配{ age: { $type: "number" } }
6、管理命令
// 查看当前数据库
db.getName()

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

// 查看集合统计信息
db.users.stats()

// 查看数据库存储大小
db.stats()

// 执行原生JavaScript(危险,慎用)
db.eval("function() { return db.users.count(); }")
7、安全与认证
// 创建管理员用户(需先以管理员身份登录)
use admin
db.createUser({
  user: "admin",
  pwd: "strong_password",
  roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
})

// 创建普通用户(仅限访问特定数据库)
use mydb
db.createUser({
  user: "reader",
  pwd: "read_only",
  roles: [{ role: "read", db: "mydb" }]
})

// 验证用户(切换用户后需验证)
db.auth("reader", "read_only")
8、备份与恢复
# 导出整个数据库(生成BSON文件)
mongodump --db mydb --out /backup/

# 导入备份(恢复数据)
mongorestore --db mydb /backup/mydb/

# 导出为JSON(适合数据交换)
mongoexport --db mydb --collection users --out users.json

# 从JSON导入
mongoimport --db mydb --collection users --file users.json
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值