当前位置: 首页 > news >正文

NoSQL 数据库和内存数据库 - MongoDB简单了解

NoSQL 数据库和内存数据库(IMDB)区别

NoSQL 数据库

以 “数据模型与关系型数据库的差异” 为分类标准:指 “非关系型数据库”(Not Only SQL),用于解决关系型数据库在灵活数据模型、水平扩展、大数据量处理等方面的局限性。核心特征是:非结构化 / 半结构化数据模型、无固定 Schema(模式)、支持分布式扩展,数据模型多样(键值、文档、列族、图等)。

内存数据库(IMDB)

以 “数据主要存储位置” 为分类标准:指将数据主要存储在内存(而非磁盘) 中的数据库。核心目标是通过内存的高速读写特性,实现毫秒级甚至微秒级的响应速度,满足高并发、低延迟场景需求。(注:多数内存数据库会通过磁盘进行数据持久化,防止内存断电丢失,但核心读写操作基于内存。)

核心区别对比
维度内存数据库(IMDB)NoSQL数据库
分类标准数据主要存储位置(内存为主)数据模型(非关系型,区别于SQL的表结构)
核心目标极致的读写性能(低延迟、高吞吐)灵活的数据模型、高扩展性、大数据量适配
数据存储位置主要在内存,磁盘仅用于持久化(可选)可在磁盘(如MongoDB)或内存(如Redis)
数据模型无固定模型,可简单(如键值)或复杂(如关系)非关系型,多样(文档、键值、列族、图等)
典型场景高频交易、实时缓存、会话存储、实时分析社交数据、日志存储、内容管理、LBS应用等
持久化依赖依赖额外机制(如RDB/AOF)防止内存数据丢失磁盘存储天然持久化;内存型NoSQL需额外机制
与关系型的关系可兼容关系模型(如VoltDB是内存型关系数据库)明确区别于关系型,不依赖表、行、列结构
典型例子与交叉情况
  • 仅属于内存数据库
    VoltDB(内存型关系数据库,支持SQL,不属于NoSQL)、Memcached(纯内存键值存储,无持久化,属于内存数据库,也常被归为NoSQL)。

  • 仅属于NoSQL数据库
    MongoDB(文档型,数据主要存储在磁盘,不属于内存数据库)、HBase(列族型,分布式磁盘存储)、Neo4j(图数据库,磁盘存储)。

  • 同时属于两者
    Redis(键值型NoSQL,数据主要在内存,支持磁盘持久化,因此既是内存数据库也是NoSQL)。

总结

  • 内存数据库的核心是“用内存换速度”,解决延迟问题;
  • NoSQL的核心是“用灵活模型和扩展性换适应性”,解决关系型数据库的局限。
  • 两者分类维度不同,可能重叠(如Redis),也可能完全独立(如MongoDB是NoSQL但非内存数据库,VoltDB是内存数据库但非NoSQL)。
    MongoDB 是一款开源的文档型 NoSQL 数据库,由 MongoDB Inc. 开发,旨在为现代应用(如高并发、大数据量、灵活数据模型的场景)提供高性能、高可用性和易扩展性的存储方案。与传统关系型数据库(如 MySQL)的“表-行-列”结构不同,MongoDB 采用“数据库-集合-文档”的层次结构,数据以类似 JSON 的格式存储,更贴近开发者的代码思维。

核心特点

  1. 文档型存储:数据以 BSON(Binary JSON) 格式存储(BSON 是 JSON 的二进制扩展,支持更多数据类型,如日期、二进制数据等)。每个文档类似一个“记录”,可包含嵌套字段和数组,结构灵活。
  2. 动态模式(Schema-less):集合(类似关系型数据库的“表”)中的文档无需遵循统一结构,不同文档可拥有不同字段,无需预先定义“表结构”,适合数据格式频繁变化的场景。
  3. 高可扩展性:支持水平扩展(通过分片将数据分布到多个服务器),可轻松应对数据量增长。
  4. 强大的查询能力:支持复杂查询(如条件筛选、投影、排序、分页、聚合)、索引、地理空间查询等,语法接近自然语言。
  5. 高可用性:通过副本集(Replica Set) 实现数据冗余和自动故障转移(主节点故障时,从节点自动切换为主节点)。

基本概念(与关系型数据库对比)

MongoDB 概念关系型数据库概念说明
数据库(Database)数据库(Database)存储多个集合的容器,一个 MongoDB 实例可包含多个数据库。
集合(Collection)表(Table)存储多个文档的容器,类似表,但集合中的文档结构可不同。
文档(Document)行(Row)数据的基本单元,以 BSON 格式表示(类似 JSON 对象),每个文档有唯一 _id 字段作为主键。
字段(Field)列(Column)文档中的键值对,类似表中的列,但字段可动态添加/删除,无需统一。

数据模型示例

以“用户”数据为例,MongoDB 的文档结构可以灵活包含嵌套信息(如地址、订单),无需像关系型数据库那样拆分到多个表:

// 一个用户文档(BSON格式)
{"_id": ObjectId("60d21b4667d0d8992e610c85"),  // 自动生成的唯一ID"name": "张三","age": 25,"email": "zhangsan@example.com","address": {  // 嵌套文档"city": "北京","street": "朝阳区XX路"},"hobbies": ["篮球", "编程"],  // 数组"createdAt": ISODate("2023-06-21T08:00:00Z")  // BSON日期类型
}

核心操作(CRUD)

MongoDB 提供丰富的 API 用于数据操作,以下是基本的 CRUD 示例(基于 MongoDB Shell,一种交互式命令行工具):

1. 插入数据(Create)
// 插入单条文档
db.users.insertOne({name: "李四",age: 30,email: "lisi@example.com"
});// 插入多条文档
db.users.insertMany([{ name: "王五", age: 28, email: "wangwu@example.com" },{ name: "赵六", age: 22, email: "zhaoliu@example.com" }
]);
2. 查询数据(Read)
// 查询所有文档
db.users.find();// 条件查询(年龄大于25的用户)
db.users.find({ age: { $gt: 25 } });// 投影(只返回name和age字段,不返回_id)
db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 });// 排序(按age降序)
db.users.find().sort({ age: -1 });// 分页(跳过前1条,取2条)
db.users.find().skip(1).limit(2);
3. 更新数据(Update)
// 更新单条文档(将name为"李四"的用户年龄改为31)
db.users.updateOne({ name: "李四" },  // 查询条件{ $set: { age: 31 } }  // 更新操作($set是更新操作符,只修改指定字段)
);// 更新多条文档(将所有年龄小于25的用户添加"isYoung": true字段)
db.users.updateMany({ age: { $lt: 25 } },{ $set: { isYoung: true } }
);
4. 删除数据(Delete)
// 删除单条文档(删除name为"赵六"的用户)
db.users.deleteOne({ name: "赵六" });// 删除多条文档(删除所有age大于30的用户)
db.users.deleteMany({ age: { $gt: 30 } });

索引

索引是提升查询性能的关键,MongoDB 支持多种索引类型:

  • 单字段索引:对单个字段创建索引,如 db.users.createIndex({ name: 1 })(1 表示升序,-1 表示降序)。
  • 复合索引:对多个字段创建索引,如 db.users.createIndex({ name: 1, age: -1 }),优化多字段查询。
  • 文本索引:支持全文搜索,如 db.articles.createIndex({ content: "text" }),可通过 $text 操作符查询包含特定关键词的文档。

事务支持

MongoDB 从 4.0 版本开始支持多文档事务,确保跨多个文档的操作要么全部成功,要么全部失败,满足数据一致性需求。例如:

// 开启事务
const session = db.getMongo().startSession();
session.startTransaction();try {// 操作1:扣减用户余额db.users.updateOne({ _id: ObjectId("...") },{ $inc: { balance: -100 } },{ session });// 操作2:添加订单记录db.orders.insertOne({ userId: ObjectId("..."), amount: 100 },{ session });// 提交事务session.commitTransaction();
} catch (error) {// 回滚事务session.abortTransaction();
} finally {session.endSession();
}

适用场景

  • 大数据量、高并发的 web 应用(如社交平台、电商)。
  • 数据模型灵活多变(如内容管理系统、日志存储)。
  • 需要快速迭代开发(无需预先设计固定表结构)。
  • 地理空间数据(MongoDB 内置地理空间索引,适合LBS应用)。

不适用场景

  • 需复杂多表关联查询(关系型数据库更擅长)。
  • 强事务一致性要求(尽管支持事务,但复杂事务场景下关系型数据库更成熟)。
  • 数据结构固定且需严格约束(如金融核心系统的账户数据)。

快速上手

  1. 安装 MongoDB:从 MongoDB 官网 下载对应系统的安装包,或通过 Docker 快速部署。
  2. 启动服务:运行 mongod 命令启动数据库服务(默认端口 27017)。
  3. 连接数据库:使用 mongo 命令启动 Shell,或通过驱动(如 Node.js 的 mongoose、Python 的 pymongo)在代码中操作。

总之,MongoDB 以其灵活的数据模型、高扩展性和易用性,成为现代应用开发中常用的 NoSQL 数据库之一,尤其适合需要快速迭代和处理海量非结构化数据的场景。

http://www.dtcms.com/a/568578.html

相关文章:

  • CSS3层叠样式表
  • AI SEO实战:利用人工智能提升网站排名与流量的完整策略
  • 个人网站 不用备案吗大学网页制作搜题软件
  • Iden3 协议规范(Version 0)详细总结
  • 破局延时任务(下):Spring Boot + DelayQueue 优雅实现分布式延时队列(实战篇)
  • HTTP协议深度解析:从基础到性能优化
  • NEWBASIC 2.06.7 API 帮助与用户使用手册
  • python MongoDB 基础
  • 在Ubuntu系统上安装英伟达(NVIDIA)RTX 3070 Ti的驱动程序
  • SpringBoot同时使用MyBatis事务以及MongoDB事务
  • 上海建筑网站大全贵阳网页设计培训班
  • jQuery UI 小部件方法调用
  • Robot栏配置
  • 基于openresty实现短链接跳长链接服务
  • tcl脚本|异步FIFO约束
  • C语言基础之指针
  • 郑州网站制作工具龙岩网站建设馨烨
  • 沈阳网站建设的公司软件网站下载免费
  • iOS SwiftUI 动画开发指南
  • LeetCode算法学习之验证回文串
  • 深入掌握 OpenCV-Python:从图像处理到智能视觉
  • 运输层协议概述及UDP
  • 【多所高校合作】第四届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2025)
  • 什么网站做h5做得好登录不上wordpress
  • 个人制作的网站模板自助建站自己要做网站的来看下
  • 第十五周Fscan和利用漏洞上线远程和数据库提权上线远控
  • 第5章 所有权系统
  • 从零开始学Flink:事件驱动
  • 机器学习实现逻辑回归-癌症分类预测
  • Kafka 从入门到精通完整指南