MongoDB入门与实战-第一章-介绍

news2024/9/20 8:47:28

目录

  • 参考
  • 一、介绍
  • 二、概念
  • 三、预留默认库
  • 四、 MongoDB 集合
  • 五、 MongoDB 视图
  • 六、MongoDB 索引
  • 七、MongoDB ObjectId
  • MongoDB 性能问题定位方式

参考

MongoDB 基础浅谈

一、介绍

MongoDB是为快速开发互联网Web应用而设计的数据库系统。
MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分
MongoDB的数据模型是面向文档的,简单理解MongoDB这个数据库中存的各种各样的JSON。(BSON)

  • 面向集合存储:MongoDB 是面向集合的,数据以 collection 分组存储。每个 collection 在数据库中都有唯一的名称。
  • 模式自由:集合的概念类似 MySQL 里的表,但它不需要定义任何模式。
  • 结构松散:对于存储在数据库中的文档,不需要设置相同的字段,并且相同的字段不需要相同的数据类型,不同结构的文档可以存在同一个 collection 里。
  • 高效的二进制存储:存储在集合中的文档,是以键值对的形式存在的。键用于唯一标识一个文档,一般是 ObjectId 类型,值是以 BSON 形式存在的。BSON = Binary JSON, 是在 JSON 基础上加了一些类型及元数据描述的格式。
  • 支持索引:可以在任意属性上建立索引,包含内部对象。MongoDB 的索引和 MySQL 的索引基本一样,可以在指定属性上创建索引以提高查询的速度。除此之外,MongoDB 还提供创建基于地理空间的索引的能力。
  • 支持 mapreduce:通过分治的方式完成复杂的聚合任务。
  • 支持 failover:通过主从复制机制,可以实现数据备份、故障恢复、读扩展等功能。基于复制集的复制机制提供了自动故障恢复的功能,确保了集群数据不会丢失。
  • 支持分片:MongoDB 支持集群自动切分数据,可以使集群存储更多的数据,实现更大的负载,在数据插入和更新时,能够自动路由和存储。
  • 支持存储大文件:MongoDB 中 BSON 对象最大不能超过 16 MB。对于大文件的存储,BSON 格式无法满足。GridFS 机制提供了一个存储大文件的机制,可以将一个大文件分割成为多个较小的文档进行存储。

二、概念

  • 数据库(database)
    数据库是一个仓库,在仓库中可以存放集合
  • 集合(collection)
    集合类似数组,在集合中可以存放文档,相当于 MySQL 的 table。
  • 文档(document)
    文档是数据库中最小单位,我们存储和操作的都是文档,相当于 MySQL 的 row
  • field: 数据域,相当于 MySQL 的 column。
  • index: 索引。
  • primary key: 主键。

三、预留默认库

MongoDB 预留了几个特殊的 database。

  • admin: admin 数据库主要是保存 root 用户和角色。例如,system.users 表存储用户,system.roles 表存储角色。一般不建议用户直接操作这个数据库。将一个用户添加到这个数据库,且使它拥有 admin 库上的名为 dbAdminAnyDatabase 的角色权限,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如关闭服务器。
  • local: local 数据库是不会被复制到其他分片的,因此可以用来存储本地单台服务器的任意 collection。一般不建议用户直接使用 local 库存储任何数据,也不建议进行 CRUD 操作,因为数据无法被正常备份与恢复。
  • config: 当 MongoDB 使用分片设置时,config 数据库可用来保存分片的相关信息。

一个 MongoDB 实例的数据结构如下图:
在这里插入图片描述

四、 MongoDB 集合

MongoDB 集合存在于数据库中,没有固定的结构,可以往集合插入不同格式和类型的数据。集合不需要事先创建。当第一个文档插入,或者第一个索引创建时,集合就会被创建。集合名必须以下划线或者字母符号开始,并且不能包含 $,不能为空字符串(比如 “”),不能包含空字符,且不能以 system. 为前缀。

capped collection 是固定大小的集合,支持高吞吐的插入操作和查询操作。它的工作方式与循环缓冲区类似,当一个集合填满了被分配的空间,则通过覆盖最早的文档来为新的文档腾出空间。和标准的 collection 不同,capped collection 需要显式创建,指定大小,单位是字节。capped collection 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以更新 capped collection 中的文档,不可以超过之前文档的大小,以便确保所有文档在磁盘上的位置一直保持不变。

五、 MongoDB 视图

视图基于已有的集合进行创建,是只读的,不实际存储硬盘,通过视图进行写操作会报错。视图使用其上游集合的索引。由于索引是基于集合的,所以你不能基于视图创建、删除或重建索引,也不能获取视图的索引列表。如果视图依赖的集合是分片的, 那么视图也视为分片的。视图是实时计算并读取的。

六、MongoDB 索引

MongoDB 支持丰富的索引方式。如果没有索引,读操作就必须扫描集合中的每个文档并筛选符合查询条件的记录。索引能够在很大程度上提高查询速度。

  • 单字段索引:有三种方式,(1)在单个字段上创建索引;(2)在嵌入式字段上创建索引;(3)在内嵌文档上创建索引。
  • 复合索引:支持在多个字段上匹配的查询。对任何复合索引施加 32 个字段的限制。对于复合索引,MongoDB 可以使用索引来支持对索引前缀的查询。
  • 多键索引:为了索引包含数组值的字段,MongoDB 为数组中的每个元素创建一个索引键。这些多键索引支持对数组字段的高效查询。
  • 文本索引:支持对字符串内容的文本搜索查询。文本索引可以包含任何值为字符串或字符串元素数组的字段。一个集合最多可以有一个文本索引。
  • 通配符索引:支持针对未知或任意字段的查询。例如:db.collection.createIndex( {“a.$**” : 1 } ) 可支持诸如 db.collection.find({ “a.b” : 1 })、db.collection.find({ “a.c” : { $lt : 2 } }) 等查询,提高查询效率。不能使用通配符索引来分片集合。不能为通配符创建复合索引。
  • 通配符文本索引:通配符文本索引不同于通配符索引。通配符索引不支持使用KaTeX parse error: Expected '}', got 'EOF' at end of input: …reateIndex( { "**": “text” } )。
  • 2dsphere 索引:支持球体上的地理空间查询:包含、相交和邻近度查询。
  • hashed 索引:支持使用哈希的分片键进行分片。基于哈希的分片使用字段的散列索引作为分片键,以便跨分片集群对数据进行分区。MongoDB 支持任何单个字段的哈希索引,但不支持创建具有多个哈希字段的复合索引,也不能在索引上指定唯一哈希索引。
  • ttl 索引:一种特殊的单字段索引,支持在一定的时间或特定的期限后自动从集合中删除文档。TTL索引不能保证过期数据在过期时立即删除。默认每60秒运行一次删除过期文档的后台进程。capped collection 不支持 ttl 索引。
  • 唯一索引:确保索引字段不会存储重复值。如果集合已经存在了违反索引的唯一约束的文档,则后台创建唯一索引会失败。
  • 部分索引:只索引集合中满足指定筛选器表达式的文档。例如:db.collection.createIndex({ a:1 },{ partialFilterExpression: { b: { $lt: 100 } } }) 表示只对集合中 b 字段小于 100 的文进行索引,大于等于 100 的文档不会被索引。这可以有效提高存储效率。
  • 稀疏索引:只包含有索引字段的文档的条目,即使索引字段包含空值。索引会跳过任何缺少索引字段的文档。非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。

七、MongoDB ObjectId

ObjectId 可以快速生成并排序,长度为 12 个字节,包括:

一个 4 字节的时间戳,表示 unix 时间戳
5 字节随机值
3 字节递增计数器,初始化为随机值
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了 _id 字段,则自动为文档生成一个 _id。

MongoDB 性能问题定位方式

可以为 mongod 实例启用数据库分析。数据库分析器既可以在实例上启用,也可以在单个数据库层面上启用。它收集在实例上执行的 CRUD 操作、游标、命令、配置等详细信息,并将它收集的所有数据写到 system.profile 集合。这是一个capped collection,默认情况下,system.profile 容量大小为 4M。开启实时数据库分析往往伴随着副作用,请谨慎使用。
使用 db.currentOp() 操作。它返回一个文档,其中包含有关数据库实例正在进行的操作的信息。
使用 db.serverStatus() 命令。它返回一个文档,提供数据库状态的概述,通过它可以收集有关该实例的统计信息。
使用 explain 来评估查询性能,例如 cursor.explain() 或 db.collection.explain() 方法可以用来返回关于查询执行的信息。
借用一些商业工具,比如 MongoDB Ops Manager、Percona 等。

populate

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[vue3] Tree/TreeSelect树形控件使用

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

【定语从句练习题】That 、who、whom、省略

1. 改写训练 1.I’d like to speak to the person that wrote this letter. 主 2.The tomatoes that I bought yesterday. 宾,可以去掉 3.Joe’s got a motorbike that can do 200Km an hour. 主 4.Is that the computer that doesn’t work. 主 5.Those are trous…

[操作系统笔记]处理机调度

调度算法 名称英文作业调度进程调度说明特点先来先服务First-come first-served, FCFS适用适用按作业到达先后顺序(即优先考虑等待时间最长的)非抢占式短作业优先short job first, SJF适用适用作业越短(即运行时间越短)优先级越高…

SpringBoot异常:Process finished with exit code 0 | Tomcat服务没有启动 | 无法通过浏览器访问

错误信息 启动springBoot项目后,打印信息如下 意思是:我该执行的程序已执行完毕,并正常退出。 希望提示:打印Tomcat已在8080端口启动,可以通过浏览器访问,如果是这个问题,继续向下浏览&#xf…

标准库类型string和vector

一、命名空间 std::cinstd就是命名空间, 这个的含义是 :编译器应该从操作符左侧的名字所示的作用域std中去寻找cin。 另一种方式就是在开头显式进行说明: using std::cin;这样一来后续就不用再去在每条语句中显式说明了。 需要注意的是&…

微信小程序实战 wx.showNavigationBarLoading(),下拉动画配置无效

文章目录前情提要原因分析实战解析最后前情提要 下拉刷新一定是移动端常用操作,微信小程序官方集成了下拉刷新监听函数onPullDownRefresh(),以及显示下拉动画apiwx.showNavigationBarLoading(),但是我们在初次接触这个api发现,调用该函数动画不显示&…

头歌-信息安全技术-Spectre侧信道攻击过程验证

头歌-信息安全技术-Spectre侧信道攻击过程验证一、第1关:Cache vs Memory1、编程要求2、评测代码二、第2关:基于FlushReload的侧信道实现1、编程要求2、评测代码三、第3关:Spectre预测执行1、编程要求2、评测代码四、第4关:Spectr…

【Unity】关于升级到2021.3.12之后URP编译错误的问题

前几天,我一时兴起,把Unity从2021.3.11 LTS 升级到 2021.3.12 LTS,本来以为不会有啥区别,然后意想不到的是,居然出现了编译错误: 我一开始以为这个就是我的工程设置有问题,然后我就就新…

前端面试之Vue专题

目录 前言 MVVM模式 Vue的响应式原理 路由守卫 前言 网上有许多前端八股文,但是缺少便于理解的说明和案例,需要自行查阅资料。这篇文章我就按照面试的高频题来记录自己的理解和实操。 MVVM模式 一、三者含义 M是Model,数据模型&#xf…

非项目活动的时间怎么跟踪?

会计、审计、合规和专业服务企业通常需要跟踪花费在项目和非项目上的时间以进行报告。员工可以使用8Manage工时表这样的工具来获取与项目和非项目任务相关的工作时间,并记录管理时间。 非项目时间类别确定在项目工作之外发生的不同类型的活动。你可以在工时表解决方…

【网络篇】第六篇——网络套接字编程(二)(UDP详解)

基于UDP协议的套接字程序 服务端 服务端创建套接字 服务的绑定 字符串IP VS 整数IP 运行服务器 客户端 客户端创建套接字 客户端绑定 启动客户端 本地测试 INADDR_ANY 简易的回声服务器 网络测试 基于UDP协议的套接字程序 服务端 服务端创建套接字 我们把服务…

重学Android基础系列篇(三):架构动态编程技术原理

前言 本系列文章主要是汇总了一下大佬们的技术文章,属于Android基础部分,作为一名合格的安卓开发工程师,咱们肯定要熟练掌握java和android,本期就来说说这些~ [非商业用途,如有侵权,请告知我,我会删除] DD一下: And…

基于形状的匹配提纲

关键:形状,其实就是canny找出来的线条集合 1,canny线条 2,模板的线条(基于canny) 3,高斯金字塔,加速高斯法 4,没有旋转和尺度时,匹配一个有得分的结果&am…

Linux-vim使用

目录 基本vim的基本操作: 命令模式: 光标定位: $:光标定位到行右: ^:光标定位到左: shiftgG:光标定位到底部 gg:回到顶部 nshiftg表示跳转光标到第n行 文本复制相关…

输入学生的信息学号、姓名、语文成绩、数学成绩、英语成绩,计算总分、并按总分成绩排序,再写到另一个txt文件中(python)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 题目: 代码: 1.提前写入标题栏(学号、姓名、语文、数学、英语、总分) 2.再写入学生的信息 3.读取score2.txt文件 4.…

机器学习西瓜书学习记录-第五章 神经网络

第5章 神经网络 5.1神经元模型 神经网络中最基本的成分是神经元模型。 “M-P神经元模型”,又称“阈值逻辑单元” 在模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到…

分分钟让你学会栈和队列

数据结构——栈和队列 🏖️专题:数据结构 🙈作者:暴躁小程序猿 ⛺简介:双非本科大二小菜鸟一枚,希望我的博客可以对大家有所帮助 文章目录数据结构——栈和队列前言一、什么是栈?二、栈的相关概…

计算机毕设(附源码)JAVA-SSM蓟县农家乐网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

算法竞赛进阶指南 搜索 0x26 广搜变形

双端队列BFS 在最基本的广度优先搜索中,每次沿着分支的扩展都记为“一步”,我们通过逐层搜索,解决了求从起始状态到每个状态的最少步数的问题。这其实等价于在一张边权均为1的图上执行广度优先遍历,求出每个点相对于起点的最短距…

程序员的数学好难学?一切从基础开始!

数学知识对编程很有用,但是很多写给程序员的数学书都比较难。我们为什么不从基础的数学知识开始学习呢? 程序员的数学基础 Python实战 1.本书的重点不在于如何解题,而在于帮助读者在计算机世界里如何利用数学解决算法问题,让程序…