MongoDB 基础入门

2023-11-12

MongoDB 是什么?

MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常流行的 文档类型数据库 。在高负载的情况下,MongoDB 天然支持水平扩展和高可用,可以很方便地添加更多的节点/实例,以保证服务性能和可用性。在许多场景下,MongoDB 可以用于代替传统的关系型数据库或键/值存储方式,皆在为 Web 应用提供可扩展的高可用高性能数据存储解决方案。

MongoDB 的存储结构是什么?

MongoDB 的存储结构区别于传统的关系型数据库,主要由如下三个单元组成:

  • 文档(Document) :MongoDB 中最基本的单元,由 BSON 键值对(key-value)组成,类似于关系型数据库中的行(Row)。

  • 集合(Collection) :一个集合可以包含多个文档,类似于关系型数据库中的表(Table)。

  • 数据库(Database) :一个数据库中可以包含多个集合,可以在 MongoDB 中创建多个数据库,类似于关系型数据库中的数据库(Database)。

也就是说,MongoDB 将数据记录存储为文档 (更具体来说是BSON 文档),这些文档在集合中聚集在一起,数据库中存储一个或多个文档集合。

SQL 与 MongoDB 常见术语对比 :

SQL MongoDB
表(Table) 集合(Collection)
行(Row) 文档(Document)
列(Col) 字段(Field)
主键(Primary Key) 对象 ID(Objectid)
索引(Index) 索引(Index)
嵌套表(Embeded Table) 嵌入式文档(Embeded Document)
数组(Array) 数组(Array)

文档

MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。字段的值可能包括其他文档、数组和文档数组。

图片

MongoDB 文档

文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。

  • 键不能含有 \0(空字符)。这个字符用来表示键的结尾。
  • . 和 $ 有特别的意义,只有在特定环境下才能使用。
  • 以下划线_开头的键是保留的(不是严格要求的)。

BSON [bee·sahn] 是 Binary JSON的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。有关 BSON 规范的内容,可以参考 bsonspec.org,另见BSON 类型。根据维基百科对 BSON 的介绍,BSON 的遍历速度优于 JSON,这也是 MongoDB 选择 BSON 的主要原因,但 BSON 需要更多的存储空间。与 JSON 相比,BSON 着眼于提高存储和扫描效率。BSON 文档中的大型元素以长度字段为前缀以便于扫描。在某些情况下,由于长度前缀和显式数组索引的存在,BSON 使用的空间会多于 JSON。

集合

MongoDB 集合存在于数据库中,没有固定的结构,也就是 无模式 的,这意味着可以往集合插入不同格式和类型的数据。不过,通常情况下插入集合中的数据都会有一定的关联性。

图片

集合不需要事先创建,当第一个文档插入或者第一个索引创建时,如果该集合不存在,则会创建一个新的集合。集合名可以是满足下列条件的任意 UTF-8 字符串:

  • 集合名不能是空字符串""
  • 集合名不能含有 \0 (空字符),这个字符表示集合名的结尾。
  • 集合名不能以"system."开头,这是为系统集合保留的前缀。例如 system.users 这个集合保存着数据库的用户信息,system.namespaces 集合保存着所有数据库集合的信息。
  • 集合名必须以下划线或者字母符号开始,并且不能包含 $

数据库

数据库用于存储所有集合,而集合又用于存储所有文档。一个 MongoDB 中可以创建多个数据库,每一个数据库都有自己的集合和权限。MongoDB 预留了几个特殊的数据库。

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

数据库名可以是满足以下条件的任意 UTF-8 字符串:

  • 不能是空字符串""
  • 不得含有' '(空格)、.$/\和 \0 (空字符)。
  • 应全部小写。
  • 最多 64 字节。

数据库名最终会变成文件系统里的文件,这也就是有如此多限制的原因。

MongoDB 有什么特点?

  • 数据记录被存储为文档 :MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。
  • 模式自由 :集合的概念类似 MySQL 里的表,但它不需要定义任何模式,能够用更少的数据对象表现复杂的领域模型对象。
  • 支持多种查询方式 :MongoDB 查询 API 支持读写操作 (CRUD)以及数据聚合、文本搜索和地理空间查询。
  • 支持 ACID 事务 :NoSQL 数据库通常不支持事务,为了可扩展和高性能进行了权衡。不过,也有例外,MongoDB 就支持事务。与关系型数据库一样,MongoDB 事务同样具有 ACID 特性。MongoDB 单文档原生支持原子性,也具备事务的特性。MongoDB 4.0 加入了对多文档事务的支持,但只支持复制集部署模式下的事务,也就是说事务的作用域限制为一个副本集内。MongoDB 4.2 引入了分布式事务,增加了对分片集群上多文档事务的支持,并合并了对副本集上多文档事务的现有支持。
  • 高效的二进制存储 :存储在集合中的文档,是以键值对的形式存在的。键用于唯一标识一个文档,一般是 ObjectId 类型,值是以 BSON 形式存在的。BSON = Binary JSON, 是在 JSON 基础上加了一些类型及元数据描述的格式。
  • 自带数据压缩功能 :存储同样的数据所需的资源更少。
  • 支持 mapreduce :通过分治的方式完成复杂的聚合任务。不过,从 MongoDB 5.0 开始,map-reduce 已经不被官方推荐使用了,替代方案是 聚合管道。聚合管道提供比 map-reduce 更好的性能和可用性。
  • 支持多种类型的索引 :MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。
  • 支持 failover :提供自动故障恢复的功能,主节点发生故障时,自动从从节点中选举出一个新的主节点,确保集群的正常使用,这对于客户端来说是无感知的。
  • 支持分片集群 :MongoDB 支持集群自动切分数据,让集群存储更多的数据,具备更强的性能。在数据插入和更新时,能够自动路由和存储。
  • 支持存储大文件 :MongoDB 的单文档存储空间要求不超过 16MB。对于超过 16MB 的大文件,MongoDB 提供了 GridFS 来进行存储,通过 GridFS,可以将大型数据进行分块处理,然后将这些切分后的小文档保存在数据库中。

MongoDB 适合什么应用场景?

MongoDB 的优势在于其数据模型和存储引擎的灵活性、架构的可扩展性以及对强大的索引支持。选用 MongoDB 应该充分考虑 MongoDB 的优势,结合实际项目的需求来决定:

  • 随着项目的发展,使用类 JSON 格式(BSON)保存数据是否满足项目需求?MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。
  • 是否需要大数据量的存储?是否需要快速水平扩展?MongoDB 支持分片集群,可以很方便地添加更多的节点(实例),让集群存储更多的数据,具备更强的性能。
  • 是否需要更多类型索引来满足更多应用场景?MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 基础入门 的相关文章

  • NodeJS 中的密码重置

    我已经设置使用 NodeJS Passport 更新用户的密码 我遵循了这个很棒的指南 http sahatyalkabov com how to implement password reset in nodejs http sahaty
  • 使用 or 运算符进行 Morphia 查询

    我想知道如何使用 or 运算符编写 Morphia mongodb 查询我这样写了 mongodb 查询 效果很好 db Inv find or sug id 2 grp id 2 但是当我尝试在吗啡中编写此内容时 我感到很困惑 以下查询是
  • 有一种方法可以在 MongoDB 中强制引用完整性 [重复]

    这个问题在这里已经有答案了 当您搜索与 Mongo DB 相关的引用完整性时 标准响应是 MongoDB 不支持此 标准解释是 MongoDB 支持 refs 和 populate 但是没有什么可以阻止您将 ref 更改为无效值 对于许多具
  • 在 mongodb 中更新异步重复数据的最佳实践

    我正在权衡 Web 应用程序从关系 SQL 数据库迁移到 mongodb 的利弊 这是为了解决性能问题 将所有对象依赖项存储在对象本身中允许快速 读 用于向用户显示数据 另一方面 某些数据存在于不同的集合中 例如用户名位于用户集合中 但也在
  • 创建永远不匹配的 mongo 表达式的最佳方法

    我正在寻找的内容在某种程度上相当于在 SQL 中执行的操作 WHERE 1 0 我正在寻找这样的东西 因为我正在构建一个类型安全的 DSL 来在我的域上执行查询 支持连接和析取 有时 添加一个从不匹配任何内容的查询可能比在代码中处理它更容易
  • 使用 python 将多个 JSON 文件插入 MongoDB

    JSON文件如下a json b json z json 26个json文件 每个文件的 json 格式如下 a cappella word a cappella wordset id 5feb6f679a meanings id 4920
  • MongoDB的ObjectId是如何生成的?

    他们是吗somewhat随机的 我的意思是 人们能够将它们分开吗 它们不是随机的 可以很容易地预测 BSON ObjectID 是一个 12 字节值 由 4 字节时间戳组成 自纪元以来的秒数 一个 3 字节 机器 ID 2 字节进程 ID
  • 错误:键 $conditionalHandlers 不得以 '$' mongodb 开头

    我对 mongodb 特别是 Node js 的 mongoose 包有疑问 我有以下架构 var Schema mongoose Schema var location new Schema nomville type String re
  • Mongod 服务启动退出,代码为 100

    Problem 我的 mongo 服务不再启动 root machine service mongod start root machine service mongod status mongod service High perform
  • 环回关系不填充对象 ID 数组

    到目前为止我有 2 个模型 工作流程核心 工作流程步骤 工作流核心有一个steps属性 该属性是数组类型并且包含1 多个步骤 当呼叫接通时工作流程核心响应正文不会使用实际步骤对象填充步骤数组 工作流程核心 json name workflo
  • mongo BadValue 未知运算符:$or

    该集合有一份文档 id ObjectId 54b513933aca242d9915a787 carriers carrier ObjectId 54b54d223aca242d9915a788 carryingInterval from I
  • Spring Data mongodb:添加 MongoDb 访问凭据

    我的 Spring 应用程序中有以下工作配置
  • 阻止 Mongoose 为子文档数组项创建 _id 属性

    如果您有子文档数组 Mongoose 会自动为每个子文档创建 id 例子 id mainId subDocArray id unwantedId field value id unwantedId field value 有没有办法告诉 M
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • 为什么 Mongohint 可以使查询运行速度提高 10 倍?

    如果我使用explain 从shell运行mongo查询 获取所使用的索引的名称 然后再次运行相同的查询 但使用hint 指定要使用的相同索引 解释计划中的 millis 字段是显着下降 例如 没有提供任何提示 gt gt db event
  • 相同的单词但不同的 unicode 字符

    我在 Windows 上使用 Python 构建了一个关于越南餐馆的问答应用程序 要编写越南语字符 我需要使用 Unicode 首先 我从使用 HTML charset utf 8 的 TripAdvisor 网站克隆数据并构建我的 Mon
  • 如何在 Spring MongoDB 聚合上投影 DBRef?

    我在 MongoDB shell 中完成了以下聚合 以获取每个用户每种类型的警报数量 db getCollection alerts aggregate unwind son group id son son level level cou
  • MongoDB 查询 IN 对象数组

    我在检索两个集合之间的信息时遇到问题 第一个集合存储员工信息 id ObjectId 4f9643967f8b9a3f0a00005a birth date 1963 09 09 departments departments id Obj
  • Mongoose 总是返回空数组? [复制]

    这个问题在这里已经有答案了 我是nodejs i的新手 我已经有一个名为aqi的数据库 集合名称为pln 我试图在网页上显示集合中的所有记录 但猫鼬总是返回空数组 我已经用其他数据库测试了它 但我可以从它们获取数据 但对于 pln mong
  • 如何同时使用 $gt 和 $lte 优化 MongoDB 查询?

    我有以下查询 有点像反向范围查找 db ip ranges find and start ip num lte 1204135028 end ip num gt 1204135028 当仅使用 lte 标识符运行时 查询会立即返回 但是当我

随机推荐

  • vue 拖拽功能样式优化

    拖拽需求完成之后 发现拖拽的过程中很丑 放下的时候光标处也是禁止 虽然说功能不影响 但是用户体验还是不太好 不够专业 所以请做以下优化 1 把需要拖拽的图标加上可拖拽属性 div 需要拖拽的元素 div draggable true 2 在
  • 数据库表关系设计

    数据库表设计 设计原则 考虑问题时 一定要站在一头考虑 常用的关联关系 主外键关联 主外键设计原则 我自己的主键可以充当别人的外键 核心知识 主键不能重复的 外键可以重复 一对一 业务场景 用户 user 表与用户详情表 user info
  • sql如何查看数据库表的关联关系?

    SHOW CREATE TABLE 表名 不管是Navicat还是MySQL Workbench 要查询表的创建sql语句的话 在新建查询中执行以下sql SHOW CREATE Table BinLots 执行之后 Create Tabl
  • 在Jenkins管道中添加Webhook

    你有没有尝试过在Jenkins中添加GitHub webhook 在这篇博客中 我将演示在您的管道中添加webhook的最简单方法 首先 什么是webhook webhook的概念很简单 webhook是一个HTTP回调 当通过HTTP P
  • 【简单题】(2018)第九届蓝桥杯省赛 C/C++ A组(第一题、第二题)

    第一题 题目 标题 分数1 1 1 2 1 4 1 8 1 16 每项是前一项的一半 如果一共有20项 求这个和是多少 结果用分数表示出来 类似 3 2当然 这只是加了前2项而已 分子分母要求互质 注意 需要提交的是已经约分过的分数 中间任
  • Linux最全解压命令(*.tar *tar.gz *.gz *.tar.bz2 *.bz2 *tar.xz *.xz *tar.Z *.Z *.rar *.zip *.7z *.7za)

    压缩解压命令 这里重点介绍tar命令 它是一个打包程序 它可 以调用其它的命令 如 gzip bzip2 除此之外还有 rar zip命令 注 无特殊说明 代表文件夹 代表次一级文件夹 代表文件 一 tar 用法 tar 选项 FILE c
  • JavaScript 实现 -- 快速排序

    文章目录 快速排序 快排原理 代码实现 快排过程 时间复杂度 算法稳定性 快速排序 快速排序算法是在分治算法基础上设计出来的一种排序算法 和其它排序算法相比 快速排序算法具有效率高 耗费资源少 容易实现等优点 快排原理 选择一个基准数 通过
  • http://wp.qq.com/index.html,登录页

    1Tj HOKWyW28 TMmb Xf OJiNeTZg9K yE gt f oxqaOEW9 jFA LtDl6 zX wJXf lC nHKnU2Txt1ISzG1B3mhYAL90 e 9DBh8eGt gt u7b3F r Yl1
  • 如何做一个合格的微软技术工程师

    我是荔园微风 作为一名在IT界整整25年的老兵 今天我们来重新审视一下如何做一个合格的微软技术工程师 我认为要做一个合格的微软技术工程师 首先是要有兴趣从事这个职业 现在很多人是因为软件行业的薪资高才进入的 但我的看法是 工程师是没有办法一
  • chown -R 改不了软链接指向的文件权限?

    关于chown命令的奇怪问题 都知道在linux系统中 chown 命令用来修改文件或目录的属组 而 chown 后加 R 参数 则会修改指定目录即该目录下的所有文件的属组 那么 chown 命令修改一个软连接文件的权限呢 比如 chown
  • Android使用OKHttp访问网络获取Cookie和带Cookie的请求

    登录 取得Cookie public void login String username String userpwd FormBody body new FormBody Builder add email username add p
  • leetcode 028.实现strStr(),即查找重复字符串(KMP算法)

    前言 本题是经典的字符串单模匹配的模型 因此可以使用字符串匹配算法解决 常见的字符串匹配算法包括暴力匹配 Knuth Morris Pratt 算法 Boyer Moore 算法 Sunday 算法等 本文 前言 本题是经典的字符串单模匹配
  • Eigen中的基本函数

    Eigen中的基本函数 Eigen中矩阵的定义 include
  • 微服务和分布式一些概念

    2 1分布式一些基本概念 2 1 1微服务概述 微服务 对应用程序而言 微服务架构风格 就像是把一个单独的应用程序开发为一套小服务 每个小服务运行在自己的进程中 并使用轻量级机制通信 通常是HTTP API 这些服务围绕业务能力来构建 并通
  • 创建线程池的七种方式

    在 Java 语言中 并发编程往往都是通过床架线程池来实现的 而线程池的创建方式也有很多种 每种线程池的创建方式都对应了不同的使用场景 总结来说线程池的创建可以分为两大类 通过 Executors 创建 通过 ThreadPoolExecu
  • Java Double类型出现科学计数法问题解决

    问题描述 Double num1 0 0004 问题分析 1 当数据足够小或者足够大时 Double会将数据自动变成科学计数法 解决办法 将Double类型先变成String类型 再将String类型变为BigDecimal即可 Doubl
  • Pycharm的git密码填错了的修改方法

    本篇文章主要讲解Pycharm的git密码填错了的修改方法 日期 2022年2月18日 作者 任聪聪 填写错误密码发现提交不了git 解决办法 步骤一 打开搜索框 步骤二 搜索控制面板 步骤三 打开面板 找到用户凭据管理 步骤四 点击管理w
  • 关掉linux ssh终端后,让程序继续执行的方法

    最近买了个树莓派 发现中移动的物联网云平台挺好 就想玩玩 用树莓派上自动获取温度上报到云端 通过web显示 测试时希望在ssh上执行完命令后 关闭电脑或者ssh命令行终端后 树莓派继续运行 1 使用 nohup 命令 说明 网上有的说输入下
  • vue3+vue3-video-player+vue3-danmaku实现直播和弹幕

    视频组件 vue3 video player 首先下载vue3 video player 官方文档 Vue3VideoPlay 下载 npm i vue3 video play save 在main ts js注册 import creat
  • MongoDB 基础入门

    MongoDB 是什么 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统 由 C 编写的 MongoDB 提供了 面向文档 的存储方式 操作起来比较简单和容易 支持 无模式 的数据建模 可以存储比较复杂的数据类型