一、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> } )
参数说明&