mongo 进入Mongo
show dbs 展示出mongo里数据库有哪些
db 显示当前数据库
use admin 切换到admin这个数据库
show collections 展示里面的集合
db.info.insert({'name':'zhangsan','age':20}) 向当前数据库info列里插入这项数据
db.info.find() 查询info里的数据
db.dropDatabase() 删除当前的数据库

mongodb集合的命令
不手动创建集合:向不存在的集合中第一次加入数据时,集合会被创建出来
手动创建集合:
db.createCollection(name,options)
db.createCollection('stu')
db.createCollection('sub',{capped:true,size:10,max:10})
size 是整个集合空间大小 单位为Kb
max 是集合文档个数上限单位是 个
参数capped :默认值为false表示不设置上限,值为true表示设置上限
参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖

查看集合:show collections
删除集合:db.集合名称.drop()
检查集合是否有上限:db.集合名.isCapped()
db.stu.renameCollection('stu2') 将集合stu重命名为stu2

 

 

权限管理

mongodb的权限管理方案
MongoDB是没有默认管理员账号,所以要先添加管理员账号,并且mongodb服务器需要在运行的时候开启验证模式,用户只能在用户所在数据库登录(创建用户的数据库),包括管理员账号。
管理员可以管理所有的数据库,但是不能直接管理其他数据库,要先认证后才可以

mongodb超级管理员账号的创建
创建超级用户 使用admin数据库(超级管理员账号必须创建在该数据库上)
use admin
创建超级用户
db.createUser({'user':'python','pwd':'python','roles':['root']})
创建成功会显示如下信息
Successfully added user:{'user':'python','roles':['root']}

退出客户端再次登陆验证 此时在使用数据库各命令的时候会报权限错误,需要认证才能执行相应操作

use admin
db.auth('python','python')
python用户是创建在admin数据库上的,所以必须来到admin数据库上进行认证,认证成功会返回1,失败返回0

创建普通用户
1、选择需要创建用户的数据库
use test1
2、在使用的数据库上创建普通用户
db.createUser('user':'user1','pwd':'pwd1','roles':['read'])
创建普通用户user1,该用户在test1上的权限是只读
db.createUser('user':'user1','pwd':'pwd1',roles:['readWrite'])
创建普通用户user1,该用户在test1上的权限是读写

在其他数据库上创建普通用户
db.createUser({'user':'python1','pwd':'python1',roles:[{'role':'read','db':'dbname1'},{'role':'readWrite','db':'dbname2'}]})
在admin上创建python1用户,python1用户权限有两个,一个在dbname1上的只读,另一个是在dbname2上的读写

查看创建的用户
show users

删除用户
db.dropUser('python')

 

数据类型:

常见类型
Object ID:文档,类似mysql中的id
String:字符串,最常用,必须是有效的UTF-8
Boolean:存储一个布尔值,true或false
Integer:整数可以是32位或64位,这取决于服务器
Double:存储浮点值
Arrays:数组或列表,多个值存储到一个键
Object:用于嵌入式的文档,即一个值为一个文档
Null:存储Null值
Timestamp:时间戳,表示从1970-1-1到现在的总秒数
Data:存储当前日期或时间的UNIX时间格式

注意点:
每个文档都有一个属性,位_id,保证每个文档的唯一性,mongodb默认使用_id作为主键
可以自己去设置_id插入文档。如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID
objectID是一个12字节的十六进制数,每个字节两位,一共是24位的字符串:前4个字节为当前的时间戳,接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值

 

 增删改查

插入:
db.集合名称.insert(document)
例如:
db.stu.insert({name;'gj',gender:1})
db.stu.insert({_id:'20170101',name:'gj',gender:1})

插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的objectId

mongodb的保存
命令:db.集合名词.save(document)如果文档的_id已经存在则修改,如果文档的_id不存在则添加

查询:
命令:db.集合名称.find()

db.stu.count() 查询stu集合里有几条记录
db.stu.find({name:'zhangsan'}).count() 查询stu集合里name为zhangsan的有几条记录

mongodb的更新
命令:db.集合名词.update(<query>,<update>,{multi:<boolean>})

参数query:查询条件
参数update:更新操作符
参数multi可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
db.stu.update({name:'hr'},{$set:{name:'hys'}}) 指定键值更新操作
db.stu.update({},{$set:{gender:0}},{multi:true}) 更新全部
注意:"multi update only works with $ operators"
mongodb的删除

命令:db.集合名称.remove(<query>,{justOne: <boolean>})

db.stu.drop() 删除stu这个集合

db.dropDatabase() 删除当前数据库


参数query:可选,删除的?档的条件
参数justOne:可选, 如果设为true或1, 则只删除?条, 默认false, 表示删除多条

 

 聚合查询

语法:
db.集合名称.aggregate({管道:{表达式}})

$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档

常用表达式:
表达式:处理输入文档并输出 语法: 表达式:'$列名'
常用表达式:
$sum :计算总和,$sum:1 表示以一倍计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中

管道命令:

按照某个字段进行分组
$group是所有聚合命令中用的最多的一个命令,用来将集合中的文档分组,可用于统计结果
使用示例如下:
db.stu.aggregate([{$group:{'_id':'$gender','counter':{$sum:1}}}])
其中注意点:
db.集合名.aggregate 是语法,所有的管道命令都需要写在其中
_id表示分组的依据,按照哪个字段进行分组,需要使用$gender表示选择这个字段进行分组
$sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数

group by null
当我们需要统计整个文档的时候,$group的另一种用途就是把整个文档分为一组进行统计
使用示例如下:
db.stu.aggregate([{$group:{'_id':null,'counter':{$sum:1}}}])
其中注意点:
_id:null表示不指定分组的字段,即统计整个文档,此时获取的counter表示整个文档的个数

数据透视
正常情况在统计的不同性别的数据的时候,需要知道所有的name,需要逐条观察,如果通过某种方式把所有的name放在一起,那么此时就可以理解为数据透视
使用示例如下:
统计不同性别的学生:
db.stu.aggregate({$group:{_id:null,name:{$push:'$name'}}})

使用$$ROOT可以将整个文档放入数组中
db.stu.aggregate({$group:{_id:null,all:{$push:'$$ROOT'}}})

 

管道命令之$match
$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,和find区别在于$match操作可以把结果交给下一个管道处理,而findb学
使用示例如下:

查询年龄大于20的学生
db.stu.aggregate({$match:{age:{$gt:20}}})

查询年龄大于20的男女生的人数
db.stu.aggregate([{$match:{}}age:{$get:20},{$group:{_id:'$gender',counter:{$sum:1}}}])

 

 

管道命令之$project
$project用于修改文档的输入输出结构,例如重命名,增加,删除字段
使用示例如下:
查询学生的年龄、姓名。仅输出姓名年龄,修改age字段名为age1
db.stu.aggregate({$project:{_id:0,name:1,age:1,age1:'$age'}})

查询男女生人数,输出人数
db.stu.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}{$project:{_id:0,counter:1}}}])

6 管道命令之$sort

$sort用于将输入的文档排序后输出

使用示例如下:

查询学生信息,按照年龄升序

db.stu.aggregate({$sort:{age:1}})
查询男女人数,按照人数降序

db.stu.aggregate([
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}}]
)

7 管道命令之$skip 和 $limit

$limit限制返回数据的条数
$skip 跳过指定的文档数,并返回剩下的文档数
同时使用时先使用skip在使用limit
使用示例如下:

查询2条学生信息

db.stu.aggregate(
{$limit:2}
)

查询从第三条开始的学生信息

db.stu.aggregate(
{$skip:3}
)

统计男女生人数,按照人数升序,返回第二条数据

db.stu.aggregate([
{$group:{_id:"$gender",counter:{$sum:1}}},
{$sort:{counter:-1}},
{$skip:1},
{$limit:1}]
)

 

查询示范代码:

db.stu.insertMany([{},{},{}]) 插入多条数据
db.stu.find() 查询stu集合里的所有文档
db.stu.find({'title':'1'}) 查询stu集合里title为1的文档
db.stu.find({'title':/u/}) 查询stu集合里title里含有u的文档
db.stu.find({'title':/^u/,'rank':3}) 查询stu集合里title开头为u,并且rank为3的文档
$gte 大于等于
$gt 大于
$lte 小于等于
$lt 小于
$eq 等于
$ne 不等于
例如:
db.stu.find({'title':{$gt:4}}) 查询stu集合里title 大于4 的文档
db.stu.find({'title':{$gt:4,$lte:6}}) 查询stu集合里title 大于4并且小于等于6的文档
db.stu.find({'title':{$or:[{$gt:5,$lt:3}}]}) 查询stu集合里title 大于5或者小于3的文档
db.posts.distinct('tag') 去重查询posts集合里tag字段名
db.posts.find({'rank':{$gte:3}}) 查询posts集合里rank大于等于3的文档
db.posts.find({'rank':{$eq:4}}) rank等于4的文档
db.posts.find({'rank':{$ne:4}}) rank不等于4的文档
db.posts.find({'title':/之/,'rank':3}) title含有之而且rank为3
db.posts.find({$or:[{'title':/之/},{'rank':3}]}) title含有之或者rank为3
db.posts.find({'rank':{$in:[3,4]}}) rank含有3或者4
db.posts.insert({'title':'查询是否存在','istop':true})
db.posts.find({'istop':{$exists:true}}) 查询文档里字段含有istop的文档
db.posts.find({'istop':{$exists:false}}) 查询文档里字段不含有istop的文档
db.posts.find({},{'_id':0}).sort({'rank':1}) 按照rank进行升序排序 1为升序-1为降序 _id:0为不显示该字段 1显示 也可以用true和false表示
db.posts.find({},{'_id':0}).sort({'rank':1},{'title':-1}) 先按照rank升序排序如果ran'k相等再按照title降序排序
db.posts.find().limit(3) 找前三条 只有一个参数
db.posts.find({'rank':{$gt:3,$lt:5}},{'_id':0}) rank大于3且小于5的文档
db.stu.find().skip(2).limit(3) 跳过前两条后取前三条记录
db.posts.find({$or:[{'rank':{$gt:5}},{'rank':{$lt:3}}]},{'_id':0}) 查询rank大于5或者小于3的文档

 

 

 索引:

db.stu.getIndexes() 查看索引
db.stu.createIndex({'rank':-1}) 创建索引
db.stu.dropIndex({'rank':-1}) 删除索引
db.stu.createIndex({'title':1},{unique:true}) 创建唯一索引 title里的数据不重复
db.stu.find({name:'test10000'}).explain('executionStats') 打印出执行状态 里面有时间

 数据备份:

备份的语法:mongodump -h dbhost -d dbname -o dbdirectory

-h: 服务器地址, 也可以指定端?号
-d: 需要备份的数据库名称
-o: 备份的数据存放位置, 此?录中存放着备份出来的数据
示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

2 恢复

恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory

-h: 服务器地址
-d: 需要恢复的数据库实例
--dir: 备份数据所在位置
示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

3 导出

用于和其他平台进行交互对接,将数据导出成指定格式文件进行使用,比如数据分析常用的csv文件 用于给非计算机行业的用户查看数据,对于他们来说csv文件(打开之后是电子表格)更方便

导出语法: mongoexport -h dbhost -d dbname -c colname -o filename --type json/csv -f field

-h: 服务器地址
-d: 数据库名
-c: 集合名
-o: 导出文件名
--type: 文件类型,默认json格式,可选数据类型json,csv
-f: 需要导出的字段,导出为json格式的数据时可以不指定导出哪些字段,默认全部,导出成csv文件是必须指定
示例:mongoexport -h 192.168.196.128:27017 -d test2 -c col1 -o test1_col1 [--type csv -f name,age,number]

4 导入

导出语法: mongoimport -d dbname -c colname --file filename [--headerline --type json/csv -f field]

-h: 服务器地址
-d: 数据库名
-c: 集合名
-o: 导出文件名
--type: 文件类型,默认json格式,可选数据类型json,csv
-f: 需要导出的字段,导出为json格式的数据时可以不指定导出哪些字段,默认全部,导出成csv文件是必须指定
示例:mongoexport -h 192.168.196.128:27017 -d test2 -c col1 -o test1_col1 --type csv -f name,age,number