什么是Mongodb数据库?
- MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
- MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB特点
- 模式自由 :可以把不同结构的文档存储在同一个数据库里
- 面向集合的存储:适合存储 JSON风格文件的形式
- 完整的索引支持:对任何属性可索引
- 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
- 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
- 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组
- 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
基本操作
三元素
数据库:数据库是一个集合的物理容器,一个数据库中可以包含多个集合
注:1.不能是空字符串("")。
2.不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
3.应全部小写。
4.最多64字节集合:集合就是关系数据库中的表;类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中 {'name':'guojing','gender':'男'} {'name':'huangrong','age':18} {'book':'shuihuzhuan','heros':'108’}
注:1.集合名不能是空字符串""。
2.集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
3.集合名不能以"system."开头,这是为系统集合保留的前缀。
4.用户创建的集合名字不能含有保留字
符。有些驱动程序的确支持在集合名里面包
含,这是因为某些系统生成的集合中包含该
字符。除非你要访问这种系统创建的集合,
否则千万不要在名字里出现$。文档:文档对应着关系数据库中的行;就是一个对象,由键值对构成,是json的扩展Bson形式 {'name':'guojing','gender':'男’}
注:1.文档中的键/值对是有序的。
2.文档中的值不仅可以是在双引号里
面的字符串,还可以是其他几种数据类
型(甚至可以是整个嵌入的文档)。
3.MongoDB区分类型和大小写。
4.MongoDB的文档不能有重复的键。
5.文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
6.文档键命名规范:键不能含有\0 (空字符)。这个字符用来表示键的结尾;和$有特别的意义,只有在特定环境下才能使用。
数据库基本命令
查看当前数据库名称
db列出所有在物理上存在的数据库
show dbs切换数据库 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建
use 数据库名称查看当前数据库信息
db.stats()数据库删除:删除当前指向的数据库,需要切换到需要删除的目标数据库中,如果数据库不存在,则什么也不做
db.dropDatabase()创建集合
非固定大小的集合
db.createCollection('集合名称')
固定大小的集合(当集合存满时,新的数据会覆盖之前的数据)
db.createCollection('集合名称',{capped:true,size:指定集合的大小(单位是字节),max:指定集合中能存储的最大文档的数量})
size优先级更高查看集合
show collections删除集合
db.集合名称.drop()
关于增删改查的操作
插入数据
插入单条
db.集合名称.insert({'key':'value'})插入多条
db.集合名称.insert(
[
{'key':'value'},
{'key':'value'},
]
)
插入数据时如果没有指定,_id会帮您自动生成一个,也可以自己指定
这个id既是主键,也是一个索引
更新数据update
- 全文档更新(由一个新的文档替换之前的文档,ID不变)
db.集合名称.update(
{'key':'value'}查询条件
{'newkey':'newvalue'}新的文档
{
upsert:默认情况下为false,要更新的文档不存在,不会插入一条新数据,为true则相反
multi:默认为false,只更新查找到的第一条,为true表示更新所有
}
)
局部更新
db.集合名称.udpate(
{'key':'value'}查询条件
{
$set:{'key':'newvalue'}
}
)save:会根据id这个字段去集合下查找,如果id存在
则进行全文档更新,如果不存在,则插入一条新数据
db.集合名称.save(
{id:'','key':'value'...}
)
格式化输出
db.集合名称.find().pretty()
删除数据
删除多条
db.集合名称.remove(
{'key':'value'}条件
)删除单条
db.集合名称.remove(
{'key':'value'},条件
1 表示的不是数量,表示的是true
)
查询
- db.集合名称.find() 查询所有
- db.集合名称.find({'key':'value'}条件)
- db.集合名称.findOne({'key':'value'}条件)
比较运算符
- 等于
- 小于$lt
- 小于等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
db.集合名称.find(
{time:{$gte:100}}
)
多条件查询
db.集合名称.find(
{
time:{$ge:100},
actors:'李连杰'
}
)
逻辑或¥$or
db.movie.find(
{
$or:
[
{ time : {$gt:100}},
{autor:'李连杰'}
],
'title':'少林寺'
}
)
范围运算符
$in:在..范围
使用正则查询
db.集合名称.find(
{
key:/^正则表达式/
}
)
db.集合名称.find(
{
key:{$regex:'正则表达式'}
}
)
$type 只返回符合数据类型的文档
db.集合名称.find(
{
key:{$type:'数据类型'}
}
)
limit 限制返回
skip 跳过指定的条数
db.集合名称.find().limit(num).skip(num)
注意:limit和skip先后顺序不影响结果
sort jinxing paixu 1:升序: -1:降序
db.集合名称.find.sort({key:方向(1 or -1),key2:方向(1 or -1)})
去重
db.集合名称.distnict(
‘去重字段’,
{'条件'}
)
投影:project,可以选择查询结果中,数据的展示和隐藏
0表示隐藏,1表示显示
db.集合名称.find(
{'条件'}
{'key':1}
)
假如再设置要显示的字段时,第一个字段设置为1,只展示这一个,其他的都不展示
繁殖。只隐藏当前的字段,其他的字段都会展示出来
count:统计文档个数
db.集合名称.count(
{'条件'}
)
db.集合名称.find({'条件'}).count()
mongodb的聚合
- MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
aggregate() 方法的基本语法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
管道的概念
- 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
- MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
- 表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
聚合框架常用的操作
- $group:将集合中的文档分组,可用于统计结果。
- $project:修改输入文档的结构。可以用来重命名、增加或
删除域,也可以用于创建计算结果以及嵌套文档。 - $$match:用于过滤数据,只输出符合条件的文档。$match使
用MongoDB的标准查询操作。 - $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文
档。 - $unwind:将文档中的某一个数组类型字段拆分成多条,每条
包含数组中的一个值。 - $sort:将输入文档排序后输出。
聚合的表达式:
- $sum 计算总和。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}
]
)
- $avg 计算平均值
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}
]
)
- $min 获取集合中所有文档对应值得最小值。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}
]
)
- $max 获取集合中所有文档对应值得最大值。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}
]
)
- $push 在结果文档中插入值到一个数组中。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", url : {$push: "$url"}}}
]
)
- $first 根据资源文档的排序获取第一个文档数据。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", first_url : {$first : "$url"}}}
]
)
- $last 根据资源文档的排序获取最后一个文档数据
db.mycol.aggregate(
[
{$group : {_id : "$by_user", last_url : {$last : "$url"}}}
]
)
- $$group将集合中的文档分组,可用于统计结果,_id表示分组的依据,使用某个字段的格式为'$字段'
db.article.aggregate(
[
{$group:{_id:'$by_user',counter:{$sum:1}}}
]
)
- Group by null 将集合中所有文档分为一组
db.article.aggregate(
[
{$group:{_id:null,counter:{$sum:1},likes:{$avg:"$likes"}}}
]
)
- $project 修改输入文档的结构, 可以用来重命名增加或删除域也可以用于创建计算结果以及嵌套文档
db.article.aggregate(
[
{$project:{by_user:1}}
]
)
db.article.aggregate(
[
{$project:{by_user:1,id:0}}
]
)
- $$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:20}}},
{$project:{title:1,_id:0}}
]
)
- $limit:用来限制MongoDB聚合管道返回的文档数。从集合的起始位置查找,限制返回两条
db.article.aggregate(
[
{$limit:2}
]
)
- $skip在聚合管道中跳过指定数量的文档,并返回余下的文档
db.article.aggregate(
[
{$skip:2}
]
) #在聚合管道中跳过指定数量的文档,并返回余下的文档。
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:20}}},
{$skip:2},
{$project:{title:1}}
]
)
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:20}}},
{$skip:1},
{$limit:1},
{$project:{title:1}}
]
)
- $sort:将输入文档排序后输出
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:800}}},
{$sort:{likes:-1}}
]
)
- $unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
db.article.aggregate(
[
{$unwind:'$tags'}
]
)
Mongodb管理员权限(安全方面)
超级管理员
为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户
采用了角色-用户-数据库的安全管理方式 常用系统角色如下:
- root:只在admin数据库中可用,超级账号,超级权限
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
创建超级管理用户
use admin
db.createUser(
{
user:'admin',
pwd:'123',
roles:[{role:'root',db:'admin'}]
}
)
Mongodb的备份和恢复
MongoDB 备份(mongodump)
在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。
mongodump -h dbhost -d dbname -o dbdirectory
-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d: 需要备份的数据库实例,例如:test
-o: 备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
如果没有开启权限
mongodump -h 127.0.0.1:27017 -d 数据库名称 -o ~/Desktop/数据库备份的路径
mongodump -h 127.0.0.1:27017 -o ~/Desktop/数据库备份的路径
- 如果开启了权限设置(使用超级管理员权限)
我们也可以使用账号密码的方式备份指定用户的数据库
设置了超级管理员也可以使用如下方法备份
mongodump -u username -p password --authenticationDatabase 'admin' -d dbname -o dbpath
恢复备份
mongodb使用 mongorestore 命令来恢复备份的数据。
mongorestore -h hostname:port -d dbname --dir path
-h (host): MongoDB所在服务器地址,默认为: localhost:27017
-d (db): 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--dir: 指定备份的目录
如果没有开启权限
mongorestore -h 127.0.0.1:27017 -d 数据库名称 --dir 数据库备份文件路径
mongorestore -h 127.0.0.1 -dir 数据库备份文件路径
- 下面是我添加了管理员权限之后的备份命令
如果开启了权限设置(使用超级管理员权限)
mongorestore -u username -p password --authenticationDatabase 'admin' -d 数据库名称 --dir 数据库备份文件路径
MongoDB数据导入与导出
导出工具:mongoexport
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
参数说明:
- d :数据库名
- c :collection名
- o :输出的文件名
- -type : 输出的格式,默认为json
- f :输出的字段,如果-type为csv,则需要加上-f "字段名"
示例:
导出json
mongoexport -d class1804 -c books -o ~/桌面/dump/books.json --type json
导出csv
mongoexport -d class1804 -c books -o ~/桌面/dump/books.csv --type csv -f 'by_user,likes'
数据导入:mongoimport
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv
参数说明:
- d:数据库名
- c:collection名
- -type:导入的格式默认json
- f:导入的字段名
- -headerline:如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
- -file:要导入的文件
示例:
导入json
mongoimport -d class1712B -c books --file ~/桌面/dump/books --type json
导入csv
mongoimport -d class1712B -c info --file ~/桌面/dump/