mongodb

mongodb

cccs7 Lv5

MongoDB 基础

MongoDB 概览

MongoDB是一种流行的开源NoSQL数据库管理系统。它旨在存储和管理大量的非结构化或半结构化数据,非常适合处理各种数据类型和用例。MongoDB通常用于现代Web应用程序、移动应用程序和其他需要灵活性和可扩展性的情况。

以下是与MongoDB相关的一些关键特点和概念:

  1. 面向文档:MongoDB是一种面向文档的数据库,意味着它以BSON(二进制JSON)格式存储数据文档。这些文档可以包含嵌套结构、数组和不同的数据类型,为建模复杂数据提供了灵活性。
  2. 集合:MongoDB将文档存储在集合中,类似于关系数据库中的表。集合可以容纳具有不同结构的文档,与SQL数据库中的表不同,后者要求每一行必须具有相同的模式。
  3. 无模式:MongoDB是无模式的,这意味着您可以随时向文档中添加字段,而不会影响同一集合中的其他文档。

MongoDB 相关概念

业务应用场景

传统的关系型数据库(如 MySQL ),在数据操作的 “三高” 需求以及应对 web 2.0 的网站需求面前,显得比较乏力

三高需求:

  • High performance - 对数据库高并发读写的需求。
  • Huge Storage - 对海量数据的高效率存储和访问的需求。
  • High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。

而 MongoDB 可以应对 三高的需求

具体的应用场景如下:

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

这些场景中,数据操作方面的共同特点是:

  • 数据量大
  • 写入操作频繁(读写都很频繁)
  • 价值比较低的数据,对事务性要求不高

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

选择MongoDB的时机

在架构选型上,除了上述的三个特点外,如果你还犹豫是否要选择它?可以考虑以下的一些问题:

  • 应用 不需要事务及复杂 join 支持

  • 新应用,需求会变,数据模型无法确定,想快速迭代开发

  • 应用需要2000-3000以上的读写QPS(更高也可以)

  • 应用需要TB甚至 PB 级别数据存储

  • 应用发展迅速,需要能快速水平扩展

  • 应用要求存储的数据不丢失

  • 应用需要99.999%高可用

  • 应用需要大量的地理位置查询、文本查询

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

MongoDB 体系结构

与 MySQL 对比

特征/方面 MySQL MongoDB
数据模型 关系型数据库(RDBMS) NoSQL数据库(文档存储)
结构 表格和行,需要定义模式 文档(JSON样式),无需固定模式
查询语言 SQL MongoDB查询语言
复杂查询 支持复杂的SQL查询 查询功能相对简单
灵活性 固定模式,需要预定义表结构 动态模式,可以包含不同结构的文档
扩展性 垂直和水平扩展 水平扩展
主要用途 传统关系型数据存储 大数据、分散数据、半结构化数据
高性能读取 适用于复杂联接和多表查询 适用于文档查找和读取
高性能写入 适用于大量的事务处理 适用于数据插入和更新
ACID事务支持 完全支持 部分支持(仅在单文档事务中)
社区和生态系统 大量的开发者和工具支持 逐渐增长的社区和生态系统
MySQL术语 MongoDB术语 描述
数据库(Database) 数据库(Database) 用于存储数据的逻辑容器,可以包含多个表格(MySQL)或集合(MongoDB)。
表格(Table) 集合(Collection) 数据存储的具体容器,包含多个记录(MySQL的行或MongoDB的文档)。
记录(Row) 文档(Document) 存储在表格或集合中的单个数据项。
列(Column) 字段(Field) 记录或文档中的单个数据元素。
主键(Primary Key) 主键(Primary Key) 用于唯一标识记录或文档的字段。在MongoDB中,主键字段默认为”_id”。
SQL 查询语言(Query Language) 用于在关系型数据库中执行数据操作的结构化查询语言。MongoDB使用自己的查询语言。
表格关系(Table Relationships) 文档关系(Document Relationships) 表示记录或文档之间的关联性。在MySQL中,这通常使用外键来实现。在MongoDB中,嵌套文档或引用文档可以用于表示关系。
事务(Transaction) 事务(Transaction) 一系列操作,要么全部成功执行,要么全部失败,用于确保数据的一致性和完整性。
视图(View) 聚合(Aggregation) 一种虚拟表格或集合,其数据是从其他表格或集合中计算或汇总的结果。
索引(Index) 索引(Index) 用于加快数据检索速度的数据结构。可以在MySQL和MongoDB中创建索引。
触发器(Trigger) 触发器(Trigger) 一种在特定事件发生时自动执行的代码块,用于实现数据完整性和业务逻辑。

MongoDB 数据模型

BSON

  • MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。
  • BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
  • BSON采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。
  • Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。这些类型包括date,object id,binary data,regular expression 和code。每一个驱动都以特定语言的方式实现了这些类型,查看你的驱动的文档来获取详细信息。

BSON 数据类型参考列表:

数据类型 描述 举例
字符串 UTF-8字符串都可表示为字符串类型的数据 {“x” : “foobar”}
对象id 对象id是文档的12字节的唯一 ID {“X” :ObjectId() }
布尔值 真或者假:true或者false {“x”:true}+
数组 值的集合或者列表可以表示成数组 {“x” : [“a”, “b”, “c”]}
32位整数 类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被 自动转换。 shell是不支持该类型的,shell中默认会转换成64 位浮点数
64位整数 不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位 整数 shell是不支持该类型的,shell中默认会转换成64 位浮点数
64位浮点数 shell中的数字就是这一种类型 {“x”:3.14159,”y”:3}
null 表示空值或者未定义的对象 {“x”:null}
undefined 文档中也可以使用未定义类型 {“x”:undefined}
符号 shell不支持,shell会将数据库中的符号类型的数据自动转换成 字符串
正则表达式 文档中可以包含正则表达式,采用JavaScript的正则表达式语法 {“x” : /foobar/i}
代码 文档中还可以包含JavaScript代码 {“x” : function() { /* …… */ }}
二进制数据 二进制数据可以由任意字节的串组成,不过shell中无法使用
最大值/最 小值 BSON包括一个特殊类型,表示可能的最大值。shell中没有这个 类型

数据模型

MongoDB使用一种面向文档的数据模型,其中数据以文档的形式存储在集合(Collection)中。

  1. 文档(Document)
    • 文档是MongoDB中的基本数据单元,以类似JSON的BSON(Binary JSON)格式存储。
    • 文档可以包含不同字段,字段可以是字符串、数字、数组、嵌套文档、日期等多种数据类型。
    • 不同文档可以具有不同的字段结构,这使得MongoDB非常适合存储半结构化和多样化的数据。
  2. 集合(Collection)
    • 集合类似于关系数据库中的表格,但它们不要求所有文档具有相同的字段结构。
    • 集合中包含了一组相关的文档,每个文档可以具有不同的字段和数据类型。
    • 集合通常用于组织和存储相关的文档,例如,一个集合可以包含有关用户的文档,另一个集合可以包含有关产品的文档。
  3. 字段(Field)
    • 字段是文档中的数据项,类似于关系数据库中的列。
    • 字段可以包含不同类型的数据,例如字符串、数字、日期、布尔值等。
    • 文档中的字段可以是嵌套的,也就是说,一个字段的值可以是另一个文档。
  4. 主键(_id字段)
    • 每个文档都有一个特殊的主键字段,称为”_id”。
    • “_id”字段用于唯一标识文档,如果不明确指定主键值,MongoDB会自动生成一个唯一的主键值。
    • 主键可以帮助您快速查找和识别文档。
  5. 索引(Index)
    • 索引是MongoDB中用于加快数据检索速度的数据结构。
    • 可以在字段上创建索引,以加速查询操作,类似于关系数据库中的索引。
    • 索引可以是单字段索引或复合索引,可以根据查询需求来创建。
  6. 嵌套文档
    • 文档中的字段可以包含其他文档,从而创建嵌套结构。
    • 嵌套文档允许您表示复杂的数据层次结构,例如,在一个订单文档中嵌套包含多个产品文档。

MongoDB 特点

  1. 高可用性(High Availability)
    • MongoDB支持复制集(Replica Set)架构,其中多个MongoDB服务器(成员)复制相同的数据。
    • 复制集提供了数据冗余和故障恢复机制。如果主服务器故障,系统会自动选择一个备用服务器作为新的主服务器。
    • 这确保了MongoDB在单个服务器故障时仍然可用,并提供了高可用性。
  2. 高扩展性(Scalability)
    • MongoDB支持水平扩展,可以将数据分布到多个服务器上,以应对大规模数据和高流量。
    • 分片(Sharding)是MongoDB的扩展性解决方案,它允许将数据分为多个片段,每个片段可以在不同的服务器上运行,实现了数据的平行处理和负载均衡。
  3. 高性能(High Performance)
    • MongoDB具有出色的读取性能,尤其是对于大量的文档和简单查询。
    • 写入操作也可以通过合适的配置进行优化,支持异步写入和数据缓存。
    • MongoDB还具有自动的数据分区和负载均衡功能,可以提高整体性能。
  4. 丰富的查询支持(Rich Query Support)
    • MongoDB提供了丰富的查询功能,包括复杂的查询、范围查询、正则表达式、文本搜索、地理空间查询等。
    • 聚合框架(Aggregation Framework)允许进行数据聚合和转换操作,类似于SQL中的GROUP BY和聚合函数。
    • MongoDB还支持全文本搜索和地理空间查询,适用于许多不同类型的应用程序。
  5. 无模式(schemaless) 数据库
    • MongoDB是一个无模式(schemaless)的数据库,这意味着它不需要在插入文档时显式指定字段的数据类型。在您的示例中,虽然您没有明确指定age字段的数据类型,MongoDB会根据提供的值来自动确定数据类型。
    • 在JavaScript和JSON中,数字可以表示为整数或浮点数,MongoDB能够根据提供的数据来自动推断数据类型。如果您提供的值是一个整数(如18),MongoDB会将该字段的数据类型视为整数(int)。如果您提供的是带有小数点的数字,MongoDB会将其视为浮点数(double)。
    • 这种动态数据类型的特性使MongoDB非常灵活,因为它允许您在不显式定义模式的情况下插入各种数据类型的数据。但请注意,虽然MongoDB不需要显式的模式定义,但应用程序开发者通常会在开发阶段定义模式以确保数据的一致性和可理解性。

MongoDB 快速入门

数据库操作

创建数据库

选择和创建数据库的语法格式

1
use 数据库名称

如果数据库不存在则自动创建

查看有权限查看的所有的数据库命令

1
2
3
show dbs
or
show databases

注意: 在 mongodb中,集合只有在内容插入之后才会创建,就是说 创建集合(数据表)后要在插入一个文档(记录),集合才会真正的创建

数据库名规则

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

  • 不能是空字符串(””)

  • 不得含有’ ‘(空格)、.、$、/、\和\0 (空字符)

  • 应全部小写

  • 最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

  • admin: 从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

删除数据库

删除数据库的语法 如下:

1
db.dropdatabases()

主要用来删除 已经持久化的 数据库

集合操作

在 MongoDB 中,集合(Collection)是一个用于存储文档(Document)的容器。集合类似于传统数据库中的表(Table),但它没有固定的模式(Schema)。这意味着在同一个集合中,存储的文档可以拥有不同的字段和结构。

集合可以显式的创建,也可以隐式的创建

集合的显式创建

语法

1
db.createCollection(name)

参数:

  • name: 要创建的集合的名称

例如: 要创建一个 名为 myCOllection 的 普通集合

1
db.createCollection("myCollection")

查看当前库中的表: show tables 命令

1
2
3
show collections
or
show tables

集合的命名规范

  • 集合名不能是空字符串””。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以”system.”开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

集合的隐式创建

当向一个集合插入一个文档的时候,如果集合不存在,则会自动创建集合

我们 通常使用 隐式创建文档即可

集合的删除

集合的删除语法格式如下:

1
2
3
db.collection.drop()
or
db.集合.drop()

返回值

如果成功删除选定集合,则 drop() 方法则会返回 true, 否则为 false

文档基本 CRUD

文档(document)的数据结构和 JSON 基本一致

所有存储在集合中的数据都是 BSON 格式

文档的插入
单个文档插入

db.collection.insertOne() 将单个文档插入集合中。
以下示例将新文档插入到 inventory 集合中。如果文档未指定 _id 字段,MongoDB 会将带有 ObjectId 值的 _id 字段添加到新文档中。请参阅插入行为。

Shell
1
2
3
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)

insertOne() 返回一个包含新插入文档的 _id 字段值的文档。有关返回文档的示例,请参阅 db.collection.insertOne() 参考。
要检索刚刚插入的文档,请查询集合:

1
db.inventory.find( { item: "canvas" } )
多个文档插入

db.collection.insertMany() 可以将多个文档插入到一个集合中。将文档数组传递给该方法。

以下示例将三个新文档插入到 inventory 集合中。如果文档未指定 _id 字段,MongoDB 会向每个文档添加带有 ObjectId 值的 _id 字段。请参阅插入行为。

Shell
1
2
3
4
5
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])

insertMany() 返回包含新插入文档 _id 字段值的文档。请参阅参考文献中的示例。

要检索插入的文档,请查询集合:

Shell
1
db.inventory.find( {} )
Insert behavior 插入行为
Collection Creation 集合创建

If the collection does not currently exist, insert operations will create the collection.
如果该集合当前不存在,则插入操作将创建该集合。

_id Field _id 字段

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略 _id 字段,MongoDB 驱动程序会自动为 _id 字段生成一个 ObjectId。
这也适用于通过 upsert: true 的更新操作插入的文档。

Atomicity 原子性

MongoDB 中的所有写入操作在单个文档级别上都是原子的。

Write Acknowledgement 写确认

对于写入问题,可以指定 MongoDB 请求的写入操作确认级别。

文档的基本查询
  • Title: mongodb
  • Author: cccs7
  • Created at: 2023-09-21 22:24:22
  • Updated at: 2023-09-22 14:53:17
  • Link: https://blog.cccs7.icu/2023/09/21/mongodb/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments