生活中:仓库、架子、物品
计算机:数据库、集合、数据/文档
语法:show databases
效果:
语法: use 数据库名
注意:选择不存在的数据库不会报错,后期当有数据时,系统会自动创建。隐式创建
语法:show collections
语法:db.creatCollection("集合名")
语法:db.集合名.drop()
思考:如何删除数据库?
回答:1.通过use语法选择数据库
2.db.dropDatabases()
删除数据库
数据库(查看、创建、选择、删除)
查看 show databases
创建 有单独的语法,但是忽略,隐式创建
选择 use 数据库名
删除 1.通过use语法选择数据库 2.
db.dropDatabases()
删除数据库
集合(查看、创建、删除)
查看: show collections
创建:db.creatCollection(‘集合名’) 多学一招 忽略 后期插入数据 隐式创建集合
删除:db.集合名.drop()
数据库主要用来存放项目数据
然后我们已经学会了数据库和集合的创建
思考:如何实现及合作数据的增删改查呢
回答: 通过MongoDB语法即可
语法:db.集合名.insert(json数据)
说明:集合存在 则直接插入数据,集合不存在-隐式创建
练习:在test2 数据库的c1集合中插入数据(姓名叫webopenfather 年龄18岁)
use test2
db.c1.insert({uname:“webopenfather”,age:“18”})
留心1:数据库和集合不存在隐式创建
留心2:对象的键统一不加引号方便看,但是查看集合数据时系统会自动加
留心3:mongodb会给每条数据加一个全球唯一的_id键
思考1:是否可以自定义_id值
回答:可以,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐)
db.c1.insert({_id:1})
思考2:如可插入多条记录?
回答:传递数组,数组中写一个个JSON数据即可
`db.c1.insert([` `{uname:'z3',age:3},` `{uname:'z4',age:4},` `{uname:'w5',age:5}` `])`
思考4:如何快速插入10条数据
回答:mongodb底层使用js引擎实现的,所以支持部分js语法
因此:可以写for循环
for(var i=1;i<=10;i++){
db.c2.insert({uname:“a”+i,age:i})
}
需求:在test2数据库c2集合中插入10条数据 分别为a1 a2 … a10
基础语法 db.集合名.find(条件, [,查询的列])
条件
查询的列(可选参数)
留心:不管怎么写,系统自定义的_id都会在
升级语法
db.集合名.find({键:值}) 注:值不直接写
db.集合名.find({键:{运算符:值}})
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
只获取 age为5,8,10 的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uNdFhOv3-1650111412198)(C:\Users\tian123456\AppData\Roaming\Typora\typora-user-images\image-20220413215703652.png)]
基础语法 db.集合名.update(条件,新数据 [,是否新增,是否修改多条])
是否新增:指条件匹配不到数据则插入 true是 插入 false否 不插入默认
是否修改多条:指匹配成功的数据都修改 (true是,false否默认)
升级语法
db.集合名.update(条件,新数据 )
{修改器:{键:值}}
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
需求;是用修改器将zs4的姓名改为zs44
语法:
db.c3.update({uname:"zs4"},{$set:{uname:"zs44"}})
练习3:
db.c4.insert({uname:'神龙教主',age:888,who:'男',other:'非国人'})
完成需求:
uname 改成 神龙教主 {修改器:$set}
age 增加 111 {修改器:$inc}
who改字段 sex {修改器:$rename}
other 删除 {修改器:$unset}
语法分析:
db.c4.update({uname:'神龙教主'},{uname:"webopenfather"}) #错误 替换
{$set:{uname:"webopenfather"}}
{$inc:{age:111}}
{$rename:{who:"sex"}}
{$unset:{other:true}}
留心如何一次性写多个修改器
db.c4.update({uname:'神龙教主'},{
$set:{uname:"webopenfather"},
$inc:{age:111},
$rename:{who:"sex"},
$unset:{other:true}
})
语法:db.集合名.remove(条件 [,是否删除一条])
作用:是否删除一条 true是 false 否 默认
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ooF6rw9J-1650111412199)(C:\Users\tian123456\AppData\Roaming\Typora\typora-user-images\image-20220414210322362.png)]
高级开发工程师简称:所有数据库都需要增删改查CURD
增Create
db.集合名.insert(JSON数据)
删Delete
db.集合名.remove(条件 [,是否删除一条 true是 false 否 默认])
也就是默认删除多条
改Update
db.集合名.update(条件 [,是否新增,是否修改多条])
升级语法db.update(条件,{修改器:{键:值}})
查
db.集合名.find(条件 [,查询的列])
集合名称:学生集合
集合字段:编号、学号、姓名、电话、性别、年龄、学历、备注
代码:
use school
for(var num=1;num<=20;num++){
db.stu.insert({
id:num,
no:"QF"+num,
uname:"神龙教"+num,
tel:"1111111111",
sex:"女",
school:"研究生",
remark:"土豪"
})
}
语法:db.集合名.find().sort().skip(数字).limit(数字)
说明:skip跳过指定数量(可选),limit限制查询的数量
需求:数据库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
思考:如何统计数据、实现分组统计等?
回答:通过MongoDB聚合查询
顾名思义就是把数据聚起来,然后统计
语法
db.集合名称.aggregate([
{管道:{表达式}}
.....
])
常用管道
$group 将集合中的文档分组,用于统计结果
$match 过滤数据,只要输出符合条件的文档
$sort 聚合数据进一步排序
$skip 跳过指定文档数
$limit 限制集合数据返回文档数
.....
常用表达式
$sum 总和 $sum:1 同count表示统计
$avg 平均
$min 最小值
$max 最大值
....
use test4
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:"a",sex:2,age:3})
db.c1.insert({_id:4,name:"b",sex:2,age:4})
db.c1.insert({_id:5,name:"c",sex:2,age:5})
统计 | ||
---|---|---|
统计男生、女生的总年龄
db.c1.aggregate([
{
$group:{
_id:"$sex",
rs:{$sum:"$age"}
}
}
.....
])
统计男生、女生的总人数
db.c1.aggregate([
{
$group:{
_id:"$sex",
rs:{$sum:1}
}
}
.....
])
db.c1.aggregate([
{
$group:{
_id:null,
total_num:{$sum:1},
total_avg:{$avg:"$avg"}
}
}
.....
])
查询男生、女生人数,按人数升序
db.c1.aggregate([
{
$group:{
_id:"$sex",
rs:{$sum:1}
},
$sort:{
rs:1
}
}
.....
])
创建索引语法:db.集合名.createIndex{待创建索引的列 [,额外选项]}
参数:
待创建索引的列:{键:1,...,键:-1}
说明:1升序 -1降序 例如{age:1}表示创建age索引并按照升序的方式存储
额外选项:设置索引的名称或者唯一索引等等
删除索引语法:
全部删除:db.集合名.dropIndexes()
删除指定:db.集合名.dropIndex(索引)
查看索引语法:db.集合名.getIndexes()
注意:自定义索引名字
语法:db.集合名.creatIndex{{name:1},{name:“自定义的名字”}}
语法:db.集合名.creatIndex{待添加索引的列, {unique:列名}}
语法:db.集合名.find().explain(“executionStats”)
为常作条件、排序、分组、联合操作的字段建立索引
选择唯一索引 (ps:同值较少如性别字段)
选择较小的数据列,为较长的数据列使用前缀索引 (ps:索引文件更少)
发现我们在DOS中直接输入命令就可以登录数据库
这在实战中绝对不允许的
思考:如何解决
回答:使用权限机制,开启验证模式即可
创建账号
db.createUser({
"user":"账号",
"pwd":"密码",
"roles":[{
role:"角色",
db:"所属数据库"
}]
})
角色
#角色种类
超级用户角色:root
数据库用户角色:read、readwrite
数据库管理角色:dbAdmin、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase