你懂mongoDB吗

2023-11-01

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 最大的特点就是无 Schema 限制,灵活度很高。数据格式是 BSON,BSON 是一种类似 JSON 的二进制形式的存储格式,简称 Binary JSON 它和 JSON 一样,支持内嵌的文档对象和数组对象。

跟关系型数据库概念对比

Mysql MongoDB
Database(数据库) Database(数据库)
Table(表) Collection(集合)
Row(行) Document(文档)
Column(列) Field(字段)

数据格式

MongoDB 将数据存储为一个文档,BSON 格式。由 key 和 value 组成。

 

{     "_id" : ObjectId("5e141148473cce6a9ef349c7"),    "title" : "批量更新",     "url" : "http://cxytiandi.com/blog/detail/8",     "author" : "yinjihuan",     "tags" : [        "java",         "mongodb",         "spring"    ],     "visit_count" : NumberLong(10),     "add_time" : ISODate("2019-02-11T07:10:32.936+0000")}

使用场景

  • 大数据量存储场景

MongoDB 自带副本集和分片,天生就适用于大数量场景,无需开发人员通过中间件去分库分表,非常方便。

  • 操作日志存储

很多时候,我们需要存储一些操作日志,可能只需要存储比如最近一个月的,一般的做法是定期去清理,在 MongoDB 中有固定集合的概念,我们在创建集合的时候可以指定大小,当数据量超过大小的时候会自动移除掉老数据。

  • 爬虫数据存储

爬下来的数据有网页,也有 Json 格式的数据,一般都会按照表的格式去存储,如果我们用了 MongoDB 就可以将抓下来的 Json 数据直接存入集合中,无格式限制。

  • 社交数据存储

在社交场景中使用 MongoDB 存储存储用户地址位置信息,通过地理位置索引实现附近的人,附近的地点等。

  • 电商商品存储

不同的商品有不同的属性,常见的做法是抽出公共的属性表,然后和 SPU 进行关联,如果用 MongoDB 的话那么 SPU 中直接就可以内嵌属性。

自我陶醉

MongoDB 的功能点很多,但是大部分场景下我们只用了最简单的 CRUD 操作。下面隆重的介绍下 MongoDB 的功能点,就像你去相亲一样,不好好介绍自己的优点又怎能让你对面的菇凉心动呢?

CRUD

CRUD 也就是增删改查,这是数据库最基本的功能,查询还支持全文检索,GEO 地理位置查询等。

  • db.collection.insertOne()

单个文档插入到集合中

  • db.collection.insertMany()

多个文档插入到集合中

  • db.collection.insert()

单个或者多个文件插入到集合中

  • db.collection.find( )

查询数据

  • db.inventory.updateOne()

更新单条

  • db.inventory.updateMany()

更新多条

  • db.inventory.deleteOne( )

删除单条文档

  • db.inventory.deleteMany()

删除多条文档

Aggregation

聚合操作用于数据统计方面,比如 Mysql 中会有 count,sum,group by 等功能,在 MongoDB 中相对应的就是 Aggregation 聚合操作。

聚合下面有两种方式来实现我们需要对数据进行统计的需求,一个是 aggregate,一个是 MapReduce。

下图展示了 aggregate 的执行原理:

aggregate执行原理

聚合内置了很多函数,使用好了这些函数我们就可以统计出我们想要的数据。

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

:用于过滤数据,只输出符合条件的文档。match 使用 MongoDB 的标准查询操作。

$limit:用来限制 MongoDB 聚合管道返回的文档数。

$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

$group:将集合中的文档分组,可用于统计结果。

$sort:将输入文档排序后输出。

$geoNear:输出接近某一地理位置的有序文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

下图展示了 MapReduce 的执行原理:

mapReduce执行原理

总共 4 条数据,query 指定了查询条件,只处理 status=A 的数据。

map 阶段对数据进行分组聚合,也就是形成了第三部分的效果,根据 cust_id 去重统计。

reduce 中的 key 也就是 cust_id, values 也就是汇总的 amount 集合。然后进行 sum 操作,最终的结果通过 out 输出到一个集合中。

Transactions

MongoDB 最开始是不支持事务的,在 MongoDB 中,对单个文档的操作是原子性操作。所以再设计的时候可以使用嵌入的文档和数组来描述数据之间的关系,这样就不用跨多个文档和集合进行操作,也就通过了单文档原子性消除了许多实际用例对多文档事务的需要。

任何事物都是有限制的,某些场景还是不能完全通过内嵌的方式来描述数据的关系,还是会存在多个集合,对于使用 MongoDB 的用户来说,如果能支持事务就很方便了。

不负众望,MongoDB 4.0 版本的发布,为我们带来了原生的事务操作。

Indexes

索引不用我多说了,作用大家都知道。单索引,组合索引,全文索引,Hash 索引等。

db.collection.createIndex(  {user_id: 1, add_time: 1}, {background: true})

创建索引特别要注意的是将 background 设置为 true,在建索引的过程会阻塞其它数据库操作,background 可指定以后台方式创建索引,默认为 false。这可是血的教训呀,切记切记。

Security

MongoDB 中的安全需要重视,目前启动不知道有没有强制的限制,以前启动的时候可以不指定认证的方式,也就是不需要密码即可访问,然后很多人都直接用的默认端口,暴露在公网上,给不法分子有机可乘,出现了数据被删,需要用比特币来找回数据的案例比比皆是。

还是要开启安全认证,内置了很多角色,不同的角色可操作的内容不一样,控制的比较细。

Replication

副本集是一组相同数据集的 MongoDB 实例,同时在多个节点存储数据,提高了可用性。主节点负责写入,从节点负责读取,提高整体性能。

副本集由下面的组件构成:

Primary:主节点接收所有的写操作。

Secondaries:从节点会从主节点进行数据的复制,维护跟主节点相同的数据。用于查询操作。

Arbiter:仲裁节点本身不存储数据,只参与选举。

副本集架构

Sharding

分片是 MongoDB 绝对的亮点,将数据水平拆分到多个节点。MongoDB 的分片是全自动的,我们只需要配置好分片的规则,它就能自动维护数据并存储到不同节点。MongoDB 使用分片来支持大数据量的存储和高吞吐量的操作。

下图是 Mongodb 的分片集群架构图:

sharding架构

MongoDB 分片集群由以下组件够成:

Shard:每个 shard 的数据都是独立完整的一份。并且可以作为副本集部署。

mongos:mongos 是查询路由器,在客户端和服务端中间的一层,请求会直接到 mongos,由 mongos 路由到具体的 Shard。

Config Servers:存储集群所有节点、分片数据路由信息。

GridFS

GridFS 是 MongoDB 的一个子模块,主要用于在 MongoDB 中存储文件,相当于 MongoDB 内置的一个分布式文件系统。

本质上还是讲文件的数据分块存储在集合中,默认的文件集合分为 fs.files 和 fs.chunks。

fs.files 是存储文件的基本信息,比如文件名,大小,上传时间,md5 等。fs.chunks 是存储文件真正数据的地方,一个文件会被分割成多个 chunk 块进行存储,一般为 256k/个。

GridFS文件存储格式

如果你的项目中用到了 MongoDB,那么你可以使用 GridFS 来构建一个文件系统,这样就不用去购买第三方的存储服务了。

GridFS 的好处是你不用单独去搭建一个文件系统,直接使用 Mongodb 自带的即可,备份,分片都依赖 MongoDB,维护起来也方便。

知识点总结

下图是我自己总结的一些知识点,作为一个后端开发来说,能掌握下面的内容就已经不错了,毕竟我们又不是要去抢 DBA 的饭碗,如果大家业余时间要学习的话可以按照下面的点进行学习,几年前我录制了一套视频,在我的网站上,大部分内容都覆盖到了。

MongoDB知识点汇总

工作必用

MongoDB 跟 Mysql 的语法对比

Spring Boot 中集成 MongoDB

加入 MongoDB 的依赖:

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
 

配置 MongoDB 的信息:​​​​​​​

spring.data.mongodb.database=testspring.data.mongodb.host=localhostspring.data.mongodb.port=27017// 用户名,密码省略.......

直接注入 MongoTemplate 就可以操作 MongoDB:

​​​​​​​​​​​​​​

@Autowiredprivate MongoTemplate mongoTemplate;
 

使用示列

创建一个实体类,对应 MongoDB 的集合

​​​​​​​​​​​​​​

@Data@Document(collection = "article_info")public class Article {  @Id  @GeneratedValue  private Long id;  @Field("title")  private String title;  @Field("url")  private String url;  @Field("author")  private String author;  @Field("tags")  private List<String> tags;  @Field("visit_count")  private Long visitCount;  @Field("add_time")  private Date addTime;}

最终存储到数据中的格式如下:

​​​​​​​

{     "_id" : ObjectId("5e141148473cce6a9ef349c7"),    "title" : "批量更新",     "url" : "http://cxytiandi.com/blog/detail/8",     "author" : "yinjihuan",     "tags" : [        "java",         "mongodb",         "spring"    ],     "visit_count" : NumberLong(10),     "add_time" : ISODate("2019-02-11T07:10:32.936+0000")}

插入数据

​​​​​​​

Article article = new Article();article.setTitle("MongoTemplate 的基本使用 ");article.setAuthor("yinjihuan");article.setUrl("http://cxytiandi.com/blog/detail/1");article.setTags(Arrays.asList("java", "mongodb", "spring"));article.setVisitCount(0L);article.setAddTime(new Date());mongoTemplate.save(article);

数据库语法

​​​​​​​

db.article_info.save({  "title": "批量更新",  "url": "http://cxytiandi.com/blog/detail/8",  "author": "yinjihuan",  "tags": [    "java",  "mongodb",    "spring"  ],  "visit_count": NumberLong(10),  "add_time": ISODate("2019-02-11T07:10:32.936+0000")})

更新数据

​​​​​​​

Query query = Query.query(Criteria.where("author").is("yinjihuan")); Update update = Update.update("title", "MongoTemplate")        .set("visitCount", 10); mongoTemplate.updateMulti(query, update, Article.class);

数据库语法

​​​​​​​

db.article_info.updateMany(  {"author":"yinjihuan"},   {"$set":     {       "title":"MongoTemplate",        "visit_count": NumberLong(10)     }  })

删除数据

​​​​​​​

Query query = Query.query(Criteria.where("author").is("yinjihuan")); mongoTemplate.remove(query, Article.class);

数据库语法

 

db.article_info.remove({"author":"yinjihuan"})

查询数据

​​​​​​​

Query query = Query.query(Criteria.where("author").is("yinjihuan")); List<Article> articles = mongoTemplate.find(query, Article.class);

数据库语法

 

db.article_info.find({"author":"yinjihuan"})

存储文件

​​​​​​​

File file = new File("/Users/yinjihuan/Downloads/logo.png");InputStream content = new FileInputStream(file);// 存储文件的额外信息,比如用户ID,后面要查询某个用户的所有文件时就可以直接查询DBObject metadata = new BasicDBObject("userId", "1001");ObjectId fileId = gridFsTemplate.store(content, file.getName(), "image/png", metadata);

t

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你懂mongoDB吗 的相关文章

  • nodejs -- koa框架

    koa下载安装 Koa 是一个基于 Node js 的 Web 框架 它提供了一组简洁而优雅的 API 使得编写 Web 应用程序变得更加容易和快捷 以下是如何使用 Koa 创建一个 Node js 项目的步骤 安装 Node js 首先
  • koa设置静态资源以加载html页面

    koa是express之后又一个node框架 xff0c 它可以很方便的构建http服务 一般 xff0c 我们看到的koa是配合koa router路由来做服务端请求控制 xff0c 大部分是要么返回string xff0c 要么返回js
  • koa2的脚手架koa-generator使用

    我们在搭建项目的时候 xff0c 会使用一些脚手架 xff0c 今天我们使用koa2的脚手架koa generator 使用非常简单 首先 xff0c 我们需要全局安装 npm install g koa generator 创建项目 ko
  • Koa笔记 01:基础入门

    文章目录 目的 基础介绍 Koa Context Request Response 错误处理 总结 目的 Node js最基本的是用来搭建HTTP服务器使用 它内置的模块基本上可以满足基础的HTTP服务器功能 但是如果要实现比较完整的HTT
  • koa文件上传(详解koa-body)

    koa body const koa require koa const koaBody require koa body const path require path const app new koa let app new Koa
  • 分享一波js,node,vue等相关的书籍

    作者在空闲时间看了一些关于js node vue等相关的一些书籍 为了方便有需要的朋友一起学习 所以将这些书籍分享给大家 大家如果有需要的可以根据自己的需要下载 书籍清单 css相关 CSS那些事儿 flex布局相关 Flex 3权威指南
  • KOA框架编程24 在线聊天室(非常有价值的文章)

    目录 1 前言 2 功能介绍 3 前端代码 3 1 代码结构 3 2 源码下载 3 3 难点分析
  • koa后端实践

    作者借着不忙的时间用koa搭了一个后端的服务器 可轻松实现api调用 大家如果有需要 可以查看 https github com guodonglw koa demo 相比于express框架 koa框架的async await语法简直让人
  • 【Vue + Koa 前后端分离项目实战9】使用开源框架==>快速搭建后台管理系统 -- part9 项目总结

    去读书 去学一门手艺 去做任何自己喜欢的事 永远不会晚 才不会辜负这份人生 本博客教学视频来源于imoom 0到1快速构建自己的后台管理系统 课程 官方演示地址 https talelin com 目录 一 项目介绍 1 技术准备 2 学到
  • 【决战Koa之巅-1】花三分钟搭建一个简单的 Koa 服务

    KOA 是什么 基于 Node js 的下一代 web 开发框架 更直白一些就是使用 JS 开发 API 接口服务 怎么搭建 1 创建一个文件夹 mkdir koa test 2 进入文件夹 初始化 npm 根据提示输入即可 npm ini
  • 如何配置 WebStorm 为 KoaJS 提供代码补全?

    目前 WebStorm 报告 KoaJS 的方法未定义 这是一个轻微但持续的烦恼 我在网上搜索过 也搜索过WebStorm的配置对话框 但没有结果 有人将 WebStorm 与 KoaJS 一起使用并且智能感知 代码完成正常工作吗 这是一个
  • Google Cloud Functions、Node JS 8.9.x (LTS) 和 KOA 库

    我该如何使用KoaCloud Functions 中的库 快速替换 我知道 KOA 使用所有很棒的 ES2017 并更多地使用 JavaScript 的异步使用 或者可能根本不需要使用 Cloud Functions 因为 Firebase
  • 如何将我的 koa 路线分割成单独的文件?

    我正在尝试找出如何将我的路线分成单独的文件 到目前为止我已经有了这个 但它不起作用 我刚刚得到Not found当我尝试访问时http localhost 3001 api things server js var koa require
  • 使用 koa.js 显示静态 html 文件

    我想要做的是在调用索引路由 即 localhost 3000 时提供 index html 文件 我使用 koa router 进行路由 所以我的路线如下所示 app all function next Send the file here
  • Koa 中的 Promise 错误处理

    如果我在 Koa 中做出承诺 它们可能会被拒绝 function fetch var deferred q defer Some async action which calls deferred reject return deferre
  • Koa 发送响应后运行代码

    为了优化响应延迟 需要执行以下工作after响应已发送回客户端 但是 我似乎可以在发送响应后运行代码的唯一方法是使用setTimeout 有没有更好的办法 也许在发送响应后在某个地方插入代码 或者在某个地方异步运行代码 这是一些代码 koa
  • 输入“用户|未定义”不可分配给类型“用户”

    用户控制器 import User from user export class UserController public static async getuser ctx BaseContext const userRepository
  • 如何使用 Koa 提供静态文件?

    我想在我的项目中实现通用链接 并且需要通过 Koa 提供 json 这是一个名为苹果应用程序站点关联 我的文件位于 assets apple app site association apple app site association f
  • OpenShift 无法处理某些 Nodejs 依赖项 (Koa)

    我已经结账了如何在 Openshift 中设置 KoaJS https stackoverflow com questions 26924967 how to setup koajs in openshift但它仍然不起作用 这是我的一部分
  • 如何在http请求中设置边界?

    我正在尝试在 Ajax 请求中发送多部分 表单数据 我正在使用 node busboy 来解析多部分数据 但它一直抛出错误 Error Multipart Boundary not found 我读过了here https stackove

随机推荐

  • 关于OELD屏显示电池电量的简易方法

    如何采集电源电压大家可能都熟悉 stm32的ADC DMA能很方便迅速的帮我们采集到自己想要的电压数据 使用DMA进行数据搬运也能很好的减轻CPU的一部分压力 但是这样只是第一步 数据 用户想看到的有时候并不是数据 他们想要更直观方便的看到
  • angular自带的一些api_10、angular的全部api

    1 lowercase var app angular module myApp app controller myCtrl function scope console log angular lowercase AbCdEf 2 upp
  • 【2023美国大学生数学建模(美赛)资料及思路】

    美赛介绍 美国大学生数学建模竞赛 MCM ICM 由美国数学及其应用联合会主办 是世界范围内最具影响力的数学建模竞赛 赛题内容涉及经济 管理 环境 资源 生态 医学 安全 等众多领域 竞赛时间 美国东部时间 2023年2月16日下午5点开始
  • 【20220816】单片机开发是需要细心的

    GPIO ReadInputDataBit GPIOE GPIO PIN 13 和 GPIOE gt PID GPIO PIN 13 的计算结果是不一样的 如果只将 GPIO ReadInputDataBit GPIOE GPIO PIN
  • js逆向、安卓逆向教程

    JS基础 提示信息 吾爱破解 LCG LSG 安卓破解 病毒分析 www 52pojie cn 1 零基础js逆向专题 MD5通杀 长度32位置 搜索关键词 16进制 0x67452301 10进制 1732584193 RSA 搜索关键词
  • Visual Studio Code,一款功能强大且轻巧的免费代码集成编辑器介绍

    Visual Studio Code 编辑器 代码理解 调试 下载 软件官网下载地址 初步环境设置 基本设置 功能介绍 1 界面友好 代码阅读 代码编辑 下载 软件官网下载地址 链接 https azure microsoft com zh
  • Xshell正版免费,再也不用找破解版了!

    在百度网站上 搜索xshell的时候 大多都跳转到国内的xshell下载网址 但是国内的下载网址下载的xshell是收费的 解决方法就是找老外的下载网址 国外的网站还是可以下载的 学生和学校使用的免费版本 话不多说 上连接网址 https
  • 单例模式的实现方式有哪两种?

    单例模式是一种创建型设计模式 它确保一个类只有一个实例 并提供全局访问点来获取该实例 在 Java 中 实现单例模式有两种常见的方式 1 懒汉式单例 懒汉式单例在首次请求时才创建实例 如果实例已经存在 则返回现有实例 这种方式的优点是节省了
  • vue 相关面试题(路由)

    1 浅谈对路由的理解 什么是路由 根据不同的url地址展示不同的页面内容 或者数据 路由分为前端路由和后端路由 前端路由 1 前端路由 多用于单页面开发 也就是SPA 2 前端路由是不涉及到服务器的 是前端利用hash或者JavaScrip
  • 数据埋点是什么?设置埋点的意义是什么?

    作者 大头鱼 链接 https zhuanlan zhihu com p 25195217 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 所谓埋点就是在应用中特定的流程收集一些信息 用来跟踪应用使用的状况
  • docker——cmd和entrypoint

    目录 1 copy和add的区别 2 cmd和entrypoint的区别 exec模式与shell模式 3 exec模式和shell模式 小实验 exec模式 使用exec模式无法输出环境变量 shell模式 cmd和entrypoint的
  • Vue 封装短信验证码,刷新缓存倒计时

    通过本地存储封装短信验证码延时效果 可以防止用户点击刷新 刷新获取的是本地封装的时间 所以刷新不会重置倒计时 亲测有效 希望能够帮到大家 HTML 部分
  • 前端技术搭建拼图小游戏(内含源码)

    The sand accumulates to form a pagoda 写在前面 功能介绍 页面搭建 样式设置 逻辑部分 写在前面 上周我们实通过前端基础实现了俄罗斯方块游戏 今天还是继续按照我们原定的节奏来带领大家完成一个拼图游戏 功
  • 超详细!Python-Anaconda最新安装图文教程

    Anaconda简介 Anaconda是一种数据科学和机器学习的开发环境 它包含了大量的Python包 工具和库 以及可视化界面和集成开发环境 Anaconda可以方便地管理Python环境和安装第三方软件包 同时也支持多个操作系统和平台
  • 计算机网络--linux下poll函数详解

    poll函数概述 select 和 poll 系统调用的本质一样 poll 的机制与 select 类似 与 select 在本质上没有多大差别 管理多个描述符也是进行轮询 根据描述符的状态进行处理 但是 poll 没有最大文件描述符数量的
  • python简单绘图(根据表格绘制曲线图)

    实验数据 数据来自出版书籍 An Introduction to Statistical Learning with Applications in R Springer 2013 作者Gareth James Daniela Witten
  • AWS EC2手动/自动切换Elastic IP

    一 手动切换Elastic IP 1 进入ec2控制台 选中实例然后操作 gt 联网 gt 管理IP地址 2进入分配Elastic IP页面 点击分配 3 分配Elastic IP 4 配置Elastic IP 5 关联ip地址 二 自动脚
  • CSS 页面禁止滚动

    methods 禁止滚动 stop var mo function e e preventDefault document body style overflow hidden document addEventListener touch
  • java内部分享课题,层层深入

    正文 二叉树 由 n n gt 0 个有限节点组成一个具有层次关系的集合 看起来就像一个倒挂的树 因此称这样的数据结构为树 一个节点的子节点个数叫做度 通俗的讲就是树叉的个数 树中最大的度叫做树的度 也叫做阶 一个 2 阶树最多有 2 个子
  • 你懂mongoDB吗

    MongoDB 是一个基于分布式文件存储的数据库 由 C 语言编写 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 MongoDB 是一个介于关系数据库和非关系数据库之间的产品 是非关系数据库当中功能最丰富 最像关系数据库的 Mon