MongoDB

一、MongoDB

MongoDB 4.2:MongoDB是一个文档数据库,旨在简化开发和扩展。

MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象,字段的值可以包括其他文档,数组和文档数组。

1、介绍

使用文档的优点是:

  • 文档(即对象)对应于许多编程语言中的本机数据类型;

  • 嵌入式文档和数组减少了对昂贵连接的需求;

  • 动态模式支持流畅的多态性。

集合/视图/按需实例化视图

MongoDB将文档存储在集合中,集合类似于数据库中的表。

MongoDB还支持:

  • 只读视图(MongoDB 3.4开始)

  • 按需实例化视图(MongoDB 4.2开始)

主要功能

(1)高性能

MongoDB提供高性能的数据持久性,特别是,

  • 对嵌入式数据模型的支持减少了数据库系统上的I/O活动;

  • 索引支持更快的查询,并且可以包括来自嵌入式文档和数组的键。

(2)丰富的查询语言

MongoDB支持丰富的查询语言,以支持读写操作(CRUD)以及资料汇总文本搜索地理空间查询,也可以查看SQL到MongoDB的映射图SQL到聚合的映射图

(3)高可用性

MongoDB的复制工具(称为副本集)提供:

  • 自动故障转移;

  • 数据冗余。

甲副本集是一组保持相同的数据集,从而提供冗余和提高数据可用性的MongoDB服务器。

(4)水平可伸缩性

MongoDB提供水平可伸缩性作为其核心功能的一部分:

  • 分片在一组计算机集群分布数据;

  • 从3.4开始,MongoDB支持基于shard键创建数据区域。在平衡的集群中,MongoDB仅将区域覆盖的读写定向到区域内中的那些分片。

(5)支持多种存储引擎

MongoDB支持多个存储引擎:

  • WiredTiger存储引擎(包括对静态加密的支持);

  • 内存中存储引擎。

此外,MongoDB提供的可插拔的存储引擎API,允许第三方为MongoDB开发存储引擎。

1、入门

db #显示当前数据库
use examples #切换到examples数据库
db.inventory.inserMany([...]); #创建inventory集合并插入数据
db.inventory.find({}) #查询inventory集合中的所有文档
db.inventory.find({}).pretty() #格式化查询结果
db.inventory.find({ status: "D" }); #返回status=D的数据
db.inventory.find({ status: "D", qty: 0 });#返回status=D且qty=0的数据
db.inventory.find({ "size.uom": "in" }); #返回在size数组中uom=in的数据
##嵌入式文档上的相等匹配要求完全匹配,包括字段顺序
db.inventory.find({tags: [ "red", "blank" ]})
##指定返回的字段,请将投影文档传递给该方法。
#<field>: 1:在返回的文档中包含一个字段
#<field>: 0:在返回的文档中排除字段
db.inventory.find({}, {item: 1, status: 1});
db.inventory.find({}, {_id: 0, item: 1, status: 1});

2、数据库和馆藏

MongoDB将BSON文档(即数据记录)存储在集合中,数据库中的集合。

(1)数据库

在MongoDB中,数据库保存文档集合。use <db>

(2)创建/删除数据库

如果数据库不存在,第一次为该数据库存储数据时,MongoDB会创建该数据库。

use myNewDB; #创建数据库
db.myNewCollection1.insertOne({x: 1}) #insertOne()操作将同时创建数据库myDB和集合myDBColl
db.dropDatabase(); #删除数据库
show dbs #查看当前数据库名

(3)(删除)集合

MongoDB将文档存储在集合中,集合类似于关系数据库中的表。

db.collection.drop(); #删除集合

(4)创建收藏

如果不存在集合,第一次为该集合存储数据时,MongoDB会创建该集合。

db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )

如果insertOne()createIndex()操作都还不存在,则它们都将创建它们各自的集合。

(5)明确创建

MongoDB提供了db.createCollection()使用各种选项显式创建集合的方法,例如设置最大大小或文档验证规则。如果未指定这些选项,则无需显式创建集合,因为在首次存储集合数据时,MongoDB会创建新集合。

(6)文档验证

默认情况下,集合不需要其文档具有相同的架构;也就是说,单个集合中的文档不需要具有相同的字段集,并且字段的数据类型可以在集合中的不同文档之间有所不同。从3.2开始,可以在更新和插入操作期间对集合强制执行文档验证规则。

(7)修改文档结构

要更改集合中文档的结构,例如添加新字段,删除现有字段或将字段值更改为新类型,将文档更新为新结构。

(8)唯一标识符

3.6版新功能:集合被分配了一个不变的UUID,集合UUID在副本集的所有成员和分片群集中的分片上均保持相同。要检索集合的UUID,运行listCollections命令或db.getCollectionInfos()方法。

3、文件资料

MongoDB将数据记录存储为BSON文档,BSON是JSON文档的二进制表示形式,BSON比JSON包含更多的数据类型。

(1)文档结构

MongoDB文档由字段和值对组成,其结构:

{
    field1: value1,
    field2: value2,
    ...
    fieldN: valueN
}

字段的值可以是任何BSON数据类型,包括其他文档,数组和文档数组。例如:

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               name: { first: "Alan", last: "Turing" },
               birth: new Date('Jun 23, 1912'),
               death: new Date('Jun 07, 1954'),
               contribs: [ "Turing machine", "Turing test", "Turingery" ],
               views : NumberLong(1250000)
            }
  • _id 拥有一个ObjectId;

  • name 包含一个包含字段和嵌入式文档,first、last;

  • birth 和 death 保留Date类型的值;

  • contribs 持有字符串数组;

  • views 拥有NumberLong类型的值。

(2)字段名称

字段名称是字符串。

文档对字段名称有以下限制:

  • 字段名称 _id 保留用作主键;它的值在集合中必须是唯一的,不可变的,并且可以是数组以外的任何类型;

  • 字段名称不能包含 null 字符串;

  • 顶级字段名称不能以美元字符($)开头;3.6开始服务器允许存储包含点(.)和美元符号($)的字段名称。

(3)字段值限制

对于索引集合,索引字段的值有一个。

(4)点符号

MongoDB使用点表示法来访问数组的元素并访问嵌入式文档的字段。

(5)阵列

要通过从零开始的索引位置指定或访问数组的元素,请将数组名称与点(.)和从零开始的索引位置连接起来,并用引号引起来:

<array>.<index>

(6)嵌入式文件

要使用点符号指定或访问嵌入式文档的字段,请将嵌入式文档名称与点(.)和字段名称连接在一起,并用引号引起来:

<embedded document>.<field>

(7)文件限制

文件大小限制:BSON文档的最大大小为16MB。最大文档大小有助于确保单个文档不会使用过多的RAM或在传输过程中占用过多的带宽。要存储大于最大大小的文档,MongoDB提供了GridFS API。

文档字段顺序

  • 该 _id 字段始终是文档中的第一个字段;

  • 包含 renaming 字段名称的更新可能会导致文档中字段的重新排序。

_id:在MongoDB中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档忽略该 _id 字段,则MongoDB驱动程序会自动为该字段生成一个ObjectId _id;

约束:

  • _id 在创建集合期间会在字段上创建唯一索引;

  • _id 字段始终是文档中的第一个字段;

  • _id 字段可以包含任何BSON数据类型的值,而不是数组。

大多数MongoDB驱动程序客户端将包括该 _id 字段并ObjectId 在将插入操作发送到MongoDB之前生成一个,但是,如果客户发送的文档中没有 _id 字段,MongoDB则会添加该 _id 字段并生成ObjectId。

(8)文档结构的其他用途

除了定义数据记录,MongoDB还在整个文档结构中使用,包括但不限于:查询过滤器、更新规范文档和索引规范文档。

查询过滤器文档:指定确定用于选择哪些记录以进行读取,更新和删除操作的条件。

{
  <field1>: <value1>,
  <field2>: { <operator>: <value> },
  ...
}

更新规范文件:使用更新运算符来指定要在db.collection.update()操作期间在特定字段上执行的数据修改。

{
  <operator1>: { <field1>: <value1>, ... },
  <operator2>: { <field2>: <value2>, ... },
  ...
}

指数规范文件

索引规范文档定义了要索引的字段和索引类型。

{ <field1>: <type1>, <field2>: <type2>, ...  }

4、BSON类型

BSON是一种二进制序列化格式,用于在MongoDB中存储文档和进行远程过程调用。

(1)ObjectId

很小,很可能是唯一的,可以快速生成并排序。长度为12个字节,包括

  • 一个4字节的时间戳记值,代表自Unix时代依来以秒为单位的ObjectId的创建;

  • 5字节随机值;

  • 3字节递增计数器,初始化为随机值。

(2)字符串

BSON字符串为UTF-8,通常,在对BSON进行序列化和反序列化时,每种编程语言的驱动程序都会从该语言的字符串格式转换为UTF-8,这样就可以轻松地将大多数国际字符存储在BSON字符串中。此外,MongoDB$regex查询在正则表达式字符串中支持UTF-8。

(3)时间戳

BSON有一个特殊的时间戳类型内部 MongoDB的使用, 不与常规相关的日期 类型。此内部时间戳记类型是64位值,其中:

  • 最重要的32位是一个time_t值(自Unix时代以来的秒数)

  • 最低有效32位是ordinal给定秒内的操作增量。

(4)日期

BSON Date是一个64位整数,代表自Unix时代(1970年1月1日)以来的毫秒数。这导致过去和将来的可表示日期范围约为2.9亿年。

BSON规格指的是BSON Date类型为UTC日期时间。

BSON日期类型已签名。负值表示1970年之前的日期。

(5)比较排序规则

  • 数值类型:为了进行比较,MongoDB将某些类型视为等效,例如,数字类型在比较之前先进行转换。

  • 字符串:①、二进制比较;②、归类:允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

  • 阵列:对于数组,小于比较或升序排序比较数组的最小元素,大于大于或降序排序比较数组的最大元素。这样,当将值是单元素数组(例如)的字段与非数组字段(例如)进行比较时,比较是和之间的 。空数组(例如)的比较将空数组视为小于或缺少字段。

  • 对象:①、出现顺序递归比较;②、比较关键字段名称;③、如果关键字段名称相等,则比较字段值;④、如果字段值相等,则比较下一个键/值对(返回①);

  • 日期和时间戳:日期对象在时间戳对象之前排序;

  • 不存在的字段:空BSON对象,处理文件等同于排序顺序;

  • BinData:①、数据长度或大小;②、按BSON的一字节子类型;③、通过数据执行逐字节比较。

2、安装

1、下载:MongoDB下载路径

2、运行msi程序并安装

3、安装向导

(1)选择设置类型

完整安装类型

(2)服务配置

MongoDB安装并配置为WIndows服务。

(3)安装MongoDB指南针

MongoDB Compass。

3、MongoDB CRUD操作

1、创建操作

创建或插入操作会将新文档添加到集合中,如果该集合当前不存在,则插入操作将会创建该集合。

MongoDB将文档插入集合中的方法:

db.collection.insert(document) #insert()和save()
​
db.collection.insertOne() #3.2版中的新功能
db.collection.insertMany() #3.2版中的新功能

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

2、读取操作

读取操作从集合中检索文档,即查询集合以获取文档,其方法:

db.collection.find();

可以指定查询过滤器或条件以标识要返回的文档。

3、更新操作

update()和save()方法更新集合中的文档

update()方法用于更新已存在的文档:

db.collection.update(    
    <query>, 
    <update>, 
    {       
        upsert: <boolean>,   
        multi: <boolean>,  
        writeConcern: <document>
    }
)

参数说明&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清梦扰i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值