查看数据库

show databases/dbs。

选择数据库

use 数据库名 (隐式创建)

删除数据库

1、通过use语法选中数据库
2、通过db.dropDatabase()



// An highlighted block
#查看数据库
show databases/dbs

#选择数据库
use 数据库名 (隐式创建)

#删除数据库
	1、通过use语法选中数据库
	2、通过db.dropDatabase()




#查看集合
show collections/tables

#创建集合
db.createCollection("集合名")

#删除 集合
db.集合名.drop()




#在数据库中插入数据
use 指定数据库
db.集合名.insert({})
	数据库和集合都不存在的话就会隐式创建
	对象的键统一不加引号方便看,但是查看集合数据时系统会自动加
	
#快速插入10条数据 (支持部分json语句)
use test1
for (var i=1;i<=10;i++){
	db.c1.insert({name:"a"+i,age:i})
}

#查询数据
db.集合名.find({} , {查询的列} ,{},{})

	运算符	作用
	$gt		大于
	$gte		大于等于
	$lt		小于
	$lte		小于等于
	$ne		不等于
	$in		in
	$nin		not in
	
db.集合名.find({键:{运算符:值}})

eg: 查询年龄大于5
	db.c1.find({age:{$gt:5}})
eg:查询年龄是5、8、10
	db.c1.find({age:{$in:[5,8,10]}})
eg:只看年龄列
	db.c1.find({},{age:1,_id:0})
	
	

#更改数据
db.集合名.update(匹配,新数据,是否新增,是否修改多条)    4个参数
						默认false,false
升级语法:运算符		作用
		$inc		递增
		$rename	重命名列
		$set		修改列值
		$unset	删除列
		
db.集合名.update(匹配,新数据)
				{修改器:{键:值}}

准备工作:插入10 条数据
	use test2
	for(var i=1; i<=10; i++){
		db.c3.insert({"uname":"zs"+i,"age":i})
	}
将zs1 改为 zs2
	db.c3.update({"uname":"zs1"},{"uname":"zs2"})	(这是替换)
	db.c3.update({uname:"zs1"},{$set:{uname:"zs22"}})	(这才是修改)

将zs10 年龄加2或减2
	db.c3.update({uname:"zs10"},{$inc:{age:2}})		(减2就是加-2)

db.c4.insert({uname:"神龙教主",age:888,who:"男",other:"非洲人"})
需求: uname改成 webppenfather	($set)
	 age增加111				($inc)
	 who改字段sex			($rename)
	 other删除				($unset)
:db.c4.update({uname:"神龙教主"},{$set:{uname:"webopenfather"},$inc:{age:111},$rename:{who:"sex"},$unset:{other:true}})





#文档的删除
db.集合名.remove(条件,是否删除一条)
					默认是false
					也就是删除多条



集合名称:school
集合字段::编号、学号、姓名、电话、性别、年龄、学历、备注
use school
switched to db school
for (var num=1; num<=20; num++){
db.stu.insert({id:num,no:"QF"+num,tel:"111111111",sex:"女",age:num,school:"研究生",remark:"土豪"})
}



#排序、分页
准备:
use test3
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:"a",sex:1,age:2})
db.c1.insert({_id:3,name:"b",sex:2,age:3})
db.c1.insert({_id:4,name:"c",sex:2,age:4})
db.c1.insert({_id:5,name:"d",sex:2,age:5})

db.c1.find()


排序
语法:db.集合名.find().sort(json数据)
说明:键-就是要排序的列/字段、 值:1 升序  -1 降序
联系:年龄升序&降序
db.c1.find().sort({age:1})
db.c1.find().sort({age:-1})


Limit 与 skip 方法
语法:db.集合名.find().sort().skip(数字)limit(数字)
说明:skip跳过指定数量(可选),limit限制查询的数量
练习1-降序查询2条		2-降序跳过2条并查询2条
db.c1.find().sort({age:-1}).skip(0).limit(2)
db.c1.find().sort({age:-1}).skip(2).limit(2)


实战分页:数据库1 - 10 数据,每页显示两条	(5页)
语法:db.集合名.find().skip().limit(2)

skip计算公式: (当前页 - 1)* 每页显示条数
1页	1	2		0
2页	3	4		2
3页	5	6		4
4页	7	8		6
5页	9	10		8






#聚合查询(分组统计)
db.aggregate([{管道:{表达式}}...])

常用管道:
$group	将集合中的文档分组,用于统计结果
$match	过滤数据,只要输出符合条件的文档
$sort		
聚合数据进一步排序
$skip		跳过指定文档数
$$limit	限制集合数据返回文档数
...

常用表达式
$sum 总和	$sum:1同count表示统计
$avg	平均
$min	最小值
$max	最大值
...

准备:
use test4
db.c1.insert({_id:1,name:"a",sex:"男",age:1})
db.c1.insert({_id:2,name:"a",sex:"男",age:2})
db.c1.insert({_id:3,name:"b",sex:"女",age:3})
db.c1.insert({_id:4,name:"c",sex:"女",age:4})
db.c1.insert({_id:5,name:"d",sex:"女",age:5})

1、统计男生、女生的总年龄
db.c1.aggregate([{
	$group:{_id:"$sex",
			result:{$sum:"$age"}}
	}])

2、统计学生综述和平均年龄
 db.c1.aggregate([
 	{$group:{_id:null,
 	total_num:{$sum:1},total_avg:{$avg:"$age"}}}])
 	
 3、查询男生女生人数,按人数升序
   db.c1.aggregate([{$group:{_id:"$sex",result:{$sum:1}}},{$sort:{result:1}}])
   		
 
 
 
 
 
 
 
 	
 #索引
 创建语法:db.集合名.createIndex(待创建索引的列[,额外选项])
 参数:
 
 
 删除:db.集合名.dropIndexes()	(全部删除)
 指定删除:db.集合名.dropIndex(索引名)
 
 
 查看索引语法:db.集合名.getIndexes()
 
 准备:添加十万数据
 use test5
 for(var i=0;i<100000;i++){db.c1.insert({'name':"aaa"+i,"age":i})}
 
:需求:给name添加普通索引
 db.c1.createIndex({name:1})	
 
 删除name索引,
 db.c1.dropIndex('name_1')
 
给name创建索引并起名webopenfather
 db.c1.createIndex({name:1},{name:"webopenfather"})
 
复合索引:
给name和age添加组合索引
语法:db.集合名.createIndex({})
db.c1.createIndex({naem:1,age:1})

唯一索引:
给name添加普通索引
语法:db.集合名.createIndex(待添加索引的列,{unique:列名})
练习:删除全部索引,命令:db.c1.dropIndexes();
练习:设置唯一索引,命令:db.c1.createIndex({name:1},{unique:"name"})
练习:测试唯一索引特性,命令: db.c1.insert({name:"a"})
					 db.c1.insert({name:"a"})



COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document

测试:age未添加索引情况
db.c1.find({age:18}).explain('executionStats')

测试:age添加索引情况
语法:db.c1.createIndex({age:1})
继续:db.c1.find({age:18}).explain('executionStats')









# mongo权限机制
创建账号

db.createUser({
	"user":"账号",
	"pwd":"秘密",
	"roles":[{
		role:"角色",
		db:"所属数据库"
		}]
})


角色:
#角色种类
超级用户角色:root
数据库用户角色:read、readwrite;
数据库管理角色:dbAdmin、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readwriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase



开启验证模式:
1、添加超级管理员	
mongo
use admin	
db.createUser({"user":"wenwei","pwd":"wenwei0106","roles":[{role:"root",db:"admin"}]})

2、退出卸载服务

bin\mongod --remove		(dos窗口必须用管理员身份运行)


3、重新安装需要输入账号密码的服务(在原安装命令基础上加上--auth即可)

D:\MongoDB\bin>mongod --install --dbpath D:\MongoDB\data --logpath D:\MongoDB\log\mongodb2.log --auth
 



4、启动服务 -> 登入测试
登入mongo后没有警告,且show dbs 看不见数据库了

# 通过超级管理员账号登入
语法1:mongo 服务器IP地址:端口、数据库 -u 用户名 -p 密码
D:\MongoDB\bin>mongo 127.0.0.1:27017/admin -u wenwei -p wenwei0106

语法2:a- 先登入,b-选择数据库,c-输入db.auth(用户名,密码)
use admin
db.auth('wenwei','wenwei0106')



#角色说明
root:只在admin数据库中可用。超级账号,超级权限;
read:允许用户读取指定数据库;
readwrite:运行用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile;
db.AdminAnyDatabase:只在admin数据库中可用,,赋予用户所有数据库的dbAdmin权限;

需求:
添加用户shop1可以读shop数据库
添加用户shop2可以读写shop数据库

准备:
use shop
for(var i=1;i<=10;i++){db.goods.insert({"name":"goodsName"+i,"price":i})}

添加用户并设置权限
use shop

##shop1
db.createUser({
	"user":"shop1",
	"pwd":"admin888",
	"roles":[{
		role:"read",
		db:"shop"
		}]
})

##shop
db.createUser({
	"user":"shop1",
	"pwd":"admin888",
	"roles":[{
		role:"readWrite",
		db:"shop"
		}]
})