MongoDB 简介

MongoDB 是一种高性能、开源的 NoSQL 数据库,以其灵活的文档模型和强大的扩展性而闻名。


1.MongoDB 是什么

MongoDB 是一种 NoSQL 数据库,采用 文档模型 存储数据,支持灵活的 JSON 格式文档。它无需预定义表结构,能够动态调整数据结构,适合处理复杂、多变的数据类型。

1.1 MongoDB 的特点

  • 灵活的文档模型:数据以 JSON 格式的文档存储,字段可以动态变化。

  • 高性能:支持水平扩展,适合处理大规模数据集。

  • 丰富的查询语言:提供强大的查询功能,支持聚合框架。

  • 高可用性:通过副本集和分片实现高可用性和负载均衡。


1.2 MongoDB 的应用场景

 

传统的关系型数据库 (比如 MySQL), 在数据操作的”三高”需求以及对应的 Web 2.0 网站需求面前, 会有”力不从心”的感觉,所谓的三高需求:

高并发, 高性能, 高可用, 简称三高

  • 数据库的高并发读写的要求
  • 海量数据的高效率存储和访问的需求
  • 对数据的高扩展性和高可用性的需求

而 MongoDB 可以应对三高需求

具体的应用场景:

  • 社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.
  • 游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.
  • 物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.
  • 物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日志信息, 并对这些信息进行多维度的分析.
  • 视频直播, 使用 MongoDB 存储用户信息, 点赞互动信息等.

这些应用场景中, 数据操作方面的共同点有:

  1. 数据量大
  2. 写入操作频繁
  3. 价值较低的数据, 对事务性要求不高

对于这样的数据, 更适合用 MongoDB 来实现数据存储

那么我们什么时候选择 MongoDB 呢?

除了架构选型上, 除了上述三个特点之外, 还要考虑下面这些问题:

  • 应用不需要事务及复杂 JOIN 支持
  • 新应用, 需求会变, 数据模型无法确定, 想快速迭代开发
  • 应用需要 2000 - 3000 以上的读写QPS(更高也可以)
  • 应用需要 TB 甚至 PB 级别数据存储
  • 应用发展迅速, 需要能快速水平扩展
  • 应用要求存储的数据不丢失
  • 应用需要 99.999% 高可用
  • 应用需要大量的地理位置查询, 文本查询

如果上述有1个符合, 可以考虑 MongoDB, 2个及以上的符合, 选择 MongoDB 绝不会后悔.

如果用MySQL呢?

相对MySQL, 可以以更低的成本解决问题(包括学习, 开发, 运维等成本)

来源:了解非关系型数据库 NoSQL - MongoDB | 安装使用以及 CRUD 操作 - Zhenye's Blog


1.3 MongoDB 与其他数据库的区别

MongoDB 与传统的关系型数据库(如 MySQL、PostgreSQL)在多个方面存在显著区别:

数据模型

  • MongoDB:文档模型,数据以 JSON 格式存储,支持动态字段。

  • 关系型数据库:表模型,数据存储在固定的表结构中,字段类型和数量固定。

存储方式

  • MongoDB:支持水平扩展(Sharding),适合处理海量数据。

  • 关系型数据库:主要通过垂直扩展(增加硬件资源)提升性能。

查询语言

  • MongoDB:使用 JSON 格式的查询语言,支持动态查询。

  • 关系型数据库:使用 SQL(结构化查询语言),语法严格。

事务支持

  • MongoDB4.0+ 支持多文档事务,但性能不如关系型数据库。

  • 关系型数据库:强事务支持,适用于对数据一致性要求极高的场景。

性能与扩展性

  • MongoDB:通过分片和副本集实现高可用性和水平扩展。

  • 关系型数据库:扩展性有限,适合处理事务密集型应用。


MongoDB 的增删改查等基本语法

MongoDB 提供了丰富的操作语法,用于数据的增删改查。

在shell中 或者 使用 springboot 都能很方便的进行增删改查。

聚合操作

db.users.aggregate([{"$project" :  {username:"$name"}}])  投影操作  只显示 id 和 name 
db.users.aggregate([{"$project" :  {username:"$name",_id:0}}])  不显示 id
db.users.aggregate([{"$project" :  {username:"$name",_id:0, age:1}}])   显示 agedb.users.aggregate([{"$match" :  {age:30}}])    匹配db.users.aggregate([{"$match" :  {age:30}}, {"$count" : "age30_count"}])    匹配计数db.users.aggregate([{"$group" :  {_id:null, count: {$sum:1}, avg: {$avg: "$age"}}}, ])    
分组聚合查询
{_id: null,count: 100,avg: 33.18
}

    索引操作(B+树)

    MongoDB 使用 B+tree 数据结构存储索引,支持快速查找和排序。

    
    创建索引
    db.users.createIndex({ age: 1 });
    age_1
    db.users.createIndex({ age: -1 });
    age_-1查询索引db.users.getIndexes();{ v: 2, key: { _id: 1 }, name: '_id_' },{ v: 2, key: { age: 1 }, name: 'age_1' },{ v: 2, key: { age: -1 }, name: 'age_-1' },{ v: 2, key: { age: 1, name: -1 }, name: 'age_1_name_-1' }
    ]使用索引  分析计划
    db.users.find({ age: 25 }).explain("executionStats");
    winningPlan: {stage: 'FETCH',inputStage: {stage: 'IXSCAN',keyPattern: {age: 1},indexName: 'age_1',isMultiKey: false,multiKeyPaths: {age: []},isUnique: false,isSparse: false,isPartial: false,indexVersion: 2,direction: 'forward',indexBounds: {age: ['[25, 25]']}}},

    集群相关知识

    MongoDB 提供了强大的集群功能,用于实现高可用性和水平扩展。

    具体可看:

    MongoDB 数据库高级进阶 - 集群和安全 - Zhenye's Blog

    副本集(Replica Set)

    副本集通过主从复制实现数据的冗余和高可用性。

    分片(Sharding)

    分片将数据分布到多个服务器上,支持大规模数据集的存储和处理。

    一般是hash sharding。

     

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23636.html

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass

    最开始的报错: 最后根据报错一步步 安装所需要的pythong之类的环境,最后终于成功了,得以让我在github上拉的vuehr项目(狗头18年还是20年的远古项目)成功本地运行,最后附上本地运行成功的贴图。如果大家也在…

    华为guass在dbever和springboot配置操作

    下面记录华为guass在dbever和springboot配置操作,以备忘。 1、安装dbeaver-ce-23.2.0-x86_64-setup.exe和驱动程序 Download | DBeaver Community 2、配置高斯数据库驱动 3、新建数据库连接 4、操作指引 opengauss官方文档 https://docs-opengauss.osinfra.cn/zh…

    今日运维之-Mac笔记本python环境问题

    1. 问题:MAC升级系统后git报错? Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…

    c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)

    数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销&#xf…

    数仓搭建实操(传统数仓oracle):DWD数据明细层

    数据处理思路 DWD层, 数据明细层>>数据清洗转换, 区分事实表,维度表 全是事实表,没有维度表>>不做处理 数据清洗>>数据类型varchar 变成varchar2, 日期格式统一(时间类型变成varchar2); 字符数据去空格 知识补充: varchar 存储定长字符类型 ; 存储的数据会…

    2.1 第一个程序:从 Hello World 开始

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 同大多数编程语言教程一样,本书第一个代码也是输出:Hello world! 这似乎也是惯例。我们也先从这个简单的代码…

    2025年02月21日Github流行趋势

    项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…

    【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 配置

    【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版(如 Ubuntu 20.04)查看和设置 WS…

    7.建立文件版题库|编写model文件|使用boost split字符串切分(C++)

    建立文件版题库 题目的编号题目的标题题目的难度题目的描述,题面时间要求(内部处理)空间要求(内部处理) 两批文件构成第一个:questions.list : 题目列表(不需要题目的内容)第二个:题目的描述,题目的预设置…

    LabVIEW中CFURL.llb 工具库说明

    CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库,主要用于处理 LabVIEW 与 URL 相关的操作,涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块,帮助开发者…

    网络运维学习笔记 017 HCIA-Datacom综合实验01

    文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置(IP二层VLAN链路聚合)ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

    6.✨Python学习价值与优势分析

    ✨Python 是一种值得深入学习的编程语言,其设计哲学、广泛的应用场景以及强大的社区支持使其成为当今最受欢迎的编程语言之一。以下从多个角度分析为什么 Python 值得深入学习: 1.🦋 简洁易学的语法 Python 以简洁、可读性强著称&#xff0c…

    Android Audio其他——数字音频接口(附)

    数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。 一、音频链路 1、模拟音频信号 可以看到在传统的…

    Spring AI + Ollama 实现调用DeepSeek-R1模型API

    一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…

    2.3 变量

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 变量是用来存放某个值的数据,它可以表示一个数字、一个字符串、一个结构、一个类等。变量包含名称、类型和值。在代码中…

    LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师

    背景 前面的文章通过 Ollama 私有化部署了 Qwen2.5 (7B) 模型,然后使用 Docker Compose 一键部署了 Dify 社区版平台。 LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库:在 Dify 平台上,通过普通编排的方式,创建了基于…

    ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

    目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…

    工程师 - VSCode的AI编码插件介绍: MarsCode

    豆包 MarsCode MarsCode AI: Coding Assistant Code and Innovate Faster with AI 豆包 MarsCode - 编程助手 安装完成并使能后,会在下方状态栏上显示MarsCode AI。 安装完并重启VSCode后,要使用这个插件,需要注册一下账号。然后授权VSCod…

    DPVS-5: 后端服务监控原理与测试

    后端监控原理 被动监测 DPVS自带了被动监控,通过监控后端服务对外部请求的响应情况,判断服务器是否可用。 DPVS的被动监测,并不能获取后端服务器的详细情况,仅仅通过丢包/拒绝情况来发觉后端服务是否可用。 TCP session state…

    Tag标签的使用

    一个非常适合运用在vue项目中的组件:Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网,搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组,…