前言
MongoDB是文档数据库,旨在简化开发和扩展,本文主要介绍关键概念和基础语句并提供操作和管理上的注意事项。
MongoDB入门级保姆教程
1 文档数据库
数据结构,由字段和值对组成的数据结构。类似于json对象。值可以包括其它文档,数组和文档数组。
{
"userId":9
}
优点:
- 文档(即对象)对应于许多编程语言中的本机数据类型。
- 嵌入式文档和数组减少了连接成本
- 动态模式,支持流畅的多态性
MongoDB将文档存储在集合中。集合类似于关系数据库中的表。
除集合外,MongoDB还支持:
- 只读视图
- 按需实例化视图
2 主要功能
高性能:
MongoDB提供高性能的数据持久性,特别是
- 对嵌入式数据模型的支持减少了数据库系统的I/O操作
- 索引支持更快的查询,并且可以包括来自嵌入式文档和数组的键
丰富的查询语言:
MongoDB支持丰富的查询语言,以支持读写操作
高可用性:
MongoDB的复制工具(副本集)提供:
- 故障自动转移
- 数据冗余
副本集是一组保持相同的数据集,从而提供冗余和提高数据可用性的MongoDB服务器
水平可伸缩性:
MongoDB提供水平可伸缩性作为其核心功能部分
- 分片在一组计算机集群分布数据
支持多种存储引擎:
- WiredTiger存储引擎(包括对静态加密的支持)
- 内存中存储引擎
- 此外,MongoDB提供可插拔的存储引擎API,允许第三方为MongoDB开发存储引擎
3 MongoDB Shell
在shell中,db代表数据库,输入db 会显示当前数据库
db
如果还没有创建数据库,会显示test数据库,test数据库是MongoDB的默认数据库
切换数据库命令 use db
use examples
切换数据库之前,不需要提前创建数据库,在第一次存储数据时,如果不存在指定的数据库,MongoDB会自动创建数据库。
MongoDB将数据存储在集合中,集合相当于关系型数据库中的表
,如果不存在相应的表,会在第一次写入的时候创建
db.testArray.insertMany(
{ item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
{ item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
{ item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
);
该操作返回一个确认指示符和一个包含id的成功插入的文档组数的数组。
查询testArray中的所有文档:
db.testArray.find({})
要格式化结果,请追加.pretty() 到find操作:
db.testArray.find({}).pretty()
条件查询:
返回其中statusfield等于的 文档"D"
db.testArray.find( { status: “D” } );
返回其中qtyfield等于的 文档0
db.testArray.find( { qty: 0 } );
其中qtyfield等于 0并且statusfield等于"D"
db.testArray.find( { qty: 0, status: “D” } );
其中uom嵌套在size 文档内的字段等于"in"
db.testArray.find( { “size.uom”: “in” } )
其中size字段等于文档:{ h: 14, w: 21, uom: “cm” }
db.testArray.find( { size: { h: 14, w: 21, uom: “cm” } } )
嵌入式文档上的相等匹配要求完全匹配,包括字段顺序。
其中tags数组包含"red"为其元素之一
db.testArray.find( { tags: “red” } )
如果该tags字段是字符串而不是数组,则查询只是一个相等匹配。
返回该tags字段与指定数组完全匹配的文档,包括顺序
db.testArray.find( { tags: [ “red”, “blank” ] } )
在find中 第二个{} 中可以作为要排除或者要展示那些数据的参数
1 :返回文档中包含该字段
0 : 返回文档中排除该字段
从集合中返回_id item 和 status
db.testArray.find( { }, { item: 1, status: 1 } );
_id字段 即可返回该字段,默认情况下返回。如果想要排除 可以手动排除
db.testArray.find( {}, { _id: 0, item: 1, status: 1 } );
4 视图
MongoDB视图是可查询对象,其内容是其它集合或视图上聚合管道的定义。
MongoDB不会将视图持久化到磁盘上。
客户端查询视图时,将按需计算视图内容。
MongoDB可以要求客户端具有查询视图的权限。
MongoDB不支持针对视图的写入操作。
创建视图
使用db.createCollection()方法或 create命令:
db.createCollection(
"<viewName>",
{
"viewOn" : "<source>",
"pipeline" : [<pipeline>],
"collation" : { <collation> }
}
)
使用db.createView()方法:
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
"collation" : { <collation> }
}
)
必须在于源数据相同的数据库里创建视图
视图表现出以下行为:
- 只读 视图是只读的;对视图的写操作将出错。
- 使用索引和排序操作 ; 视图使用基础集合和索引/索引位于基础集合之上,因此无法在视图上创建, 删除或重建索引,也无法在视图上获取索引列表。
- 投影限制;不支持以下投影 运算符:
- $
- $elemMatch
- $slice
- $meta
- 不可变名称;您不能重命名视图
- 查看与整理
- 您可以 在创建时为视图指定默认排序规则。如果未指定排序规则,则视图的默认排序规则是“简单”二进制比较排序规则。也就是说,视图不会继承集合的默认排序规则。
- 视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则的操作将失败,并显示错误。
- 如果从另一个视图创建视图,则不能指定与源视图的排序规则不同的排序规则。
- 如果执行涉及多个视图的聚合(例如with l o o k u p 或) lookup或) lookup或)graphLookup,则这些视图必须具有相同的排序规则。
若要删除视图,请使用视图上的db.collection.drop()方法。
您可以通过拖放并重新创建视图或使用collMod命令来修改视图。