mongodb是一种非关系型数据库。所谓 NoSQL ,并不是指没有 SQL ,而是指“Not Only SQL ”,即非传统关系型数据库。这类数库的主要特点包括非关系型、水平可扩展、分布式与开源。另外它还具有模式自由、最终一致性。
一、MongoDB简介
简介
MongoDB是属于NoSql的一种数据类型。MongoDB是一款强大、灵活、且易于扩展的通用型数据库
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨再为WEB引用提供可扩展的高性能数据存储解决方案,将数据存储为一个文档(类似JSON对象),数据结构由键值(key=>value)对组成支持丰富的查询表达,可以设置任何属性的索引;支持副本集、分片
它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型
(1)其使用文档来替代关系型数据库表的结构,每条数据不在要求其有无和一致性的类型。
(2)每个文档可以具备丰富的层次结构,而不是并列的属性数据。当然对于检索等情况下也不是很建议这样处理。
(3)使用横向扩展技术,面向文档的数据模型更易扩展。
(4)具备更加丰富、独特、易用的检索功能。
(5)基于内存的储存检索,性能更佳。
mongodb特点
1、数据文件存储格式为 BSON (JSON 的扩展)。{“name”:“joe”}这是 BSON 的例子,其中"name"是键,"joe"是值。键值对组成了 BSON 格式。
2、面向集合存储,易于存储对象类型和 JSON 形式的数据。所谓集合(collection)有点类似一张表格,区别在于集合没有固定的表头。
3、模式自由。一个集合中可以存储一个键值对的文档,也可以存储多个键值对的文档,还可以存储键不一样的文档,而且在生产环境下可以轻松增减字段而不影响现有程序的运行。
4、支持动态查询。mongodb 支持丰富的查询表达式,查询语句使用 JSON 形式作为参数,可以很方便地查询内嵌文档和对象数组。
5、完整的索引支持。文档内嵌对象和数组都可以创建索引。
6、支持复制和故障恢复。mongodb数据库从节点可以复制主节点的数据,主节点所有对数据的操作都会同步到从节点,从节点的数据和主节点的数据是完全一样的,以作备份。当主节点发生故障之后,从节点可以升级为主节点,也可以通过从节点对故障的主节点进行数据恢复。
7、二进制数据存储。mongodb使用传统高效的二进制数据存储方式,可以将图片文件甚至视频转换成二进制的数据存储到数据库中。
8、自动分片。自动分片功能支持水平的数据库集群,可动态添加机器。分片的功能实现海量数据的分布式存
9、支持多种语言。支持 C++、 C#、 Erlang、Haskell、JavaScript、Java、Perl、PHP、Python、Ruby、Scala 等开发语言。
10、mongodb使用的是内存映射存储引擎。mongodb会把磁盘 IO 操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用;如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。这也是mongodb快的原因。坏处是没有办法很方便地控制 mongodb占多大内存,mongodb会占用所有能用的内存,所以最好不要把别的服务和mongodb放在同一台服务器部署。
这里再提示一下,批量数据处理中,数据库的读写吞吐量与实时性大概是负相关的。
这里注意一下与redis的区别。redis存储的是键值对,本身没有办法分析数据;mongodb相当于一个大数组,本身提供了一些处理功能,如后面提到的聚合。很多复杂的查询只能通过聚合实现,这样的话redis就做不了了
mongodb教程 数据库操作
新建数据库:
use DATABASE_NAME
use:用于切换/创建数据库,若不存在则创建,否则切换到指定数据库 DATABASE_NAME:数据库名称
执行use articledb命令,创建数据库articledb
查看数据库:
show dbs
或者查看当前数据库,需要先切换到指定数据库
db
删除数据库
db.dropDatabase()
db:表示当前数据库对象
dropDatabase():用于删除当前数据库的方法
删除当前数据库,执行命令前应使用use命令切换到要删除的数据库,为了防止误删可执行命命 令db验证 当前数据库是否为指定删除的数据库
创建集合:
显示创建
db.createCollection(COLLECTION_NAME, [OPTIONS])
db.COLLECTION_NAME.insertMany([document1,document2,...])
db.COLLECTION_NAME.insert(DOCUMENT)
db:表示当前数据库对象
createCollection():创建集合方法
DOCUMENT表示文档
COLLECTION_NAME表示集合名称
OPTIONS表示集合配置
insert():向集合中插入文档的方法
删除集合:
db.COLLECTION_NAME.drop()
db:表示当前数据库对象
COLLECTION_NAME:表示集合名称
drop():删除集合方法
文档插入:
db.COLLECTION_NAME.insert(document)
或者
db.COLLECTION_NAME.save(document)
多文档插入
db.COLLECTION_NAME.insertMany([document1,document2,...])
db:当前数据库对象
COLLECTION_NAME:**当前集合对象
insert()和save():插入单文档方法
insertMany():插入多文档方法
insert()和save()方法的区别在于,若使用insert()方法插入文档时,集合中已存在该文档,则会报 错。若使用save()方法插入文档时,集合中已存在该文档,则会覆盖
文档更新:
db.COLLECTION_NAME.update(criteria,objNew,upsert, multi)
db:当前数据库对象
COLLECTION_NAME:当前集合对象
update():更新文档方法
criteria:更新的查询条件,类似sql中的where
objNew:新的对象和操作符,类似sql中的set
upsert:不存在更新对象时,是否插入,默认为false multi:默认为false,只更新查找到的第一 个文档,反之更新所有
升级语法:
db.集合名.update(条件, 新数据){修改器: {键:值}}
修改器 | 作用 |
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
文档删除:
删除单个:
db.COLLECTION_NAME.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
删除全部文档:
db.COLLECTION_NAME.remove({})
db:当前数据库对象
COLLECTION_NAME:当前集合对象
remove():删除文档方法
query:删除文档的条件,可选参数
justOne:的boolean为true或1时,表示只删除查询出的第一个文档
writeConcern: 表示抛出异常级别
文档简单查询
查询所有文档语法:
db.COLLECTION_NAME.find()
查询所有文档,以易读的方式展示:
db.COLLECTION_NAME.find().pretty()
db:当前数据库对象
COLLECTION_NAME:当前集合对象
find():查询所有文档方法
pretty():格式化查询返回结果
按条件查询文档:
基础语法:db.集合名.find(条件 [,查询的列]):
查询所有数据 {}或者不写
查询age=6的数据 {age:6}
既要age=6又要性别=男 {age:6,sex:'男'}
查询的列(可选参数
不写 - 这查询全部列(字段
{age:1} 只显示age列(字段
{age:0} 除了age列(字段都显示
留心:不管你怎么写系统自定义的_id都会在
升级语法:
运算符 | 作用 |
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
聚合操作:
聚合管道操作是将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理。聚合管 道是使用不同的管道阶段操作器进行不同聚合操作,管道阶段操作器也可称为管道操作符,常见管道操 作符如下表
常见管道操作符 | 相关说明 |
$group | 将集合中的文档进行分组,便于后续统计结果 |
$limit | 用于限制MongoDB聚合管道返回的文档数 |
$match | 用于过滤数据,只输出符合条件的文档 |
$sort | 将输入的文档先进行排序,再输出 |
$project | 用于修改输入文档的结构(增加、删除字段等)和名称 |
$skip | 在聚合管道中跳过指定数量的文档,并返回剩余的文档 |
语法:
db.集合名称.aggregate([
{管道:{表达式}}
....
])
常用表达式:
管道阶段操作器的值被称为管道表达式,并且每个管道表达式都是一个文档结构,由字段名称、字段值 和管道表达式组成。常见的管道表达式如下表
常见管道表达式 | 相关说明 |
$sum | 用于计算总和 $sum:1同count表示统计 这里没有count,使用$sum:1表示 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值的最小值 |
$max | 获取集合中所有文档对应值的最大值 |
$push | 用于在结果文档中插入值到一个数组中 |
$first | 获取分组文档中的第一个文档 |
$last | 获取分组文档中的最后一个文档 |
索引
MongoDB数据库提供了多样性的索引支持,因此可以提高查询集合中文档的效率。若是没有索引, MongoDB数据库必须执行全集合扫描(即扫描集合中的每一个文档),从而筛选出与查询条件相匹配 的文档。这种扫描全集合的查询效率是非常低的,尤其是在处理海量数据时,执行查询操作需要花费几 十秒甚至几分钟的时间,这无疑对网站的性能是非常致命的。若是执行查询操作时,集合中的文档存在 适当的索引,MongoDB就可以使用该索引限制必须检查的文档数量
索引是一种特殊的数据结构,即采用B-Tree数据结构。索引是以易于遍历读取的形式存储着集合中文 档的一小部分,文档的一小部分指文档中的特定字段或一/多组字段,并且这些字段均按照字段的值进 行排序。索引项的排序支持有效的等值匹配和基于范围的查询操作。此外,MongoDB还可以使用索引 中的排序返回排序的结果
单字段索引:
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,因此被称为单字段索引(Single Field Index)。默认情况下,MongoDB中所有集合在“_id”字段上都有一个索引,用户也可以根据自己 的需求添加额外索引来支持重要的查询和操作。由于MongoDB可以从任何方向遍历索引,因此对于单 个字段索引和排序操作来说,索引项的排序顺序(即升序或降序)并不重要
复合索引:
MongoDB除了支持单字段索引外,还支持复合索引。所谓复合索引,就是包含多个字段的索引,一个 复合索引最多可以包含31个字段。需要注意的是,若某字段属于哈希索引,则这时复合索引就不能包括 该字段
多键索引
若文档中的字段为数组类型,则每个字段都是数组中的一个元素,MongoDB将会为数组中的每个元素 创建索引,因此被称为多键索引(Multikey Index)。多键索引允许通过匹配数组的一个或多个元素来 查询包含该数组的文档。如果索引字段包含数组值,则MongoDB会自动确定是否创建多键索引,而无 需显式地指定创建多键索引
查看索引
语法:
db.COLLECTION_NAME.getIndexes()
查看索引大小:
db.COLLECTION_NAME.totalIndexSize()
创建索引:
db.COLLECTION_NAME.createIndex(keys,options)
keys:指定索引键及排序顺序,该参数值为文档类型,key用于指定索引键,value指定排序顺序,1为 升序,-1为降序
options:用于控制创建索引的选项,常见选项有unique和name,其中unique描述建立的索引是否唯 一,默认为false。name描述所创建索引的名称,默认情况下MongoDB会通过连接索引的字段名和排 序顺序生成一个索引名称
删除索引:
db.COLLECTION_NAME.dropIndexes()
删除单个索引:
db.COLLECTION_NAME.dropIndex(index)
参数index,其数据类型为字符串或文档,可用于指定要删除的索引