MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,只在WEB应用提供可扩展的高性能数据存储解决方案
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
- 基于分布式文件存储数据库
- C++语言编写
- 支持的数据结构非常松散,是类似json的bson格式(后期插入修改数据写json)
Json(JavaScript Object Notation,Js对象简谱)是一种轻量级的数据交换格式bson(二进制Json)
2.能干什么- 存放项目数据
- 实战工作写API接口(重要)
语法:show databases
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UubizZKD-1653707936496)(C:Users孙凯DesktopJava笔记MongoDBphoto查看数据库.png)]
2.选择数据库语法:user 数据库名
注意:(隐式创建)在mongodb选择不存在的数据库不会报错,后期当该数据库有数据时,系统会自动创建
3.查看集合语法:show collections
4.创建集合语法:db.createCollecion(“集合名”)
5.删除集合语法:db.集合名.drop()
6.删除数据库- 通过use语法选中数据库
- 通过db.dropDatabase()删除数据库
数据库(查看,创建,选择,删除)
查看:show databases 创建:有单独的语法,但是忽略 隐式创建 选择:use 数据库名 删除:1通过use选中数据库,2通过db.dropDatabases()删除数据库
集合(查看,创建,删除)
查看:show collection
创建:db.createCollection('集合名') 多学一招:忽略 后期插入数据 隐式创建集合
删除:db.集合名.drop()
MongoDB文档增删改查(CURD)
1.插入数据
语法:db.集合名.insert(JSON数据)
说明:集合存在-则直接插入数据 集合不存在-隐式创建
联系:在test2数据库的c1集合中插入数据(姓名叫webopenfather年龄18岁)
use test2
db.c1.insert({uname:"webopenfather",age:18})
注意:
1.数据库和集合不存在都隐式创建
2.对象的键同意不加引号方便看,但是查看集合数据时系统会自动加
3.mongodb会给每条数据增加一个全球唯一的_id键
_id组成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SW1M3gi-1653707936497)(C:Users孙凯DesktopJava笔记MongoDBphoto_id.png)]
思考1:是否可以自定义_id值?
可以,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐)
db.c1.insert({_id:1,uname:"webopenfather",age:18})
思考2:如何插入多条记录?
传递数据,数组中写一个个JSON数据即可
db.c1.insert([
{uname:"z3",age:3},
{uname:"z4",age:4},
{uname:"w5",age:5},
])
含义:一次性插入3条数据到c1集合
思考3:如何快速插入10条数据
mongodb底层使用js引擎实现的,所以支持部分js语法
因此:可以写for循环
for(var i-1;i<-10;i++){
print(i)
}
需求:在test2数据库c2集合中插入10条数据,分别为a1 ,a2 ...a10
for(var i=1;i<=10;i++){
db.c2.insert({uname:"a"+i,age:i })
}
2.查询数据
db.集合名.find().pretty() 格式化展示数据
基础语法:db.集合名.find({条件}[,查询的列])
条件
查询所有数据 {}或者不写
查询age=6的数据 {age:6}
既要age=6又要性别=男 {age:6,sex:'男'}
查询的列(可选参数)
不写 -则查询全部字段
{age:1} 只显示age字段
{age:0} 除了age字段都显示
注意:不管你怎么写系统自定义的_id都会在
升级语法
db.集合名.find({键:值}) 注:值不直接写
{运算符:值}
db.集合名.find({
键:{运算符:值}
})
| 运算符 | 作用 |
|---|---|
| $gt | 大于 |
| $gte | 大于等于 |
| $lt | 小于 |
| $lte | 小于等于 |
| $ne | 不等于 |
| $in | in |
| $nin | not in |
练习1:查询所有数据?
db.c1.find()
练习2:查询年龄大于5岁的数据?
db.c1.find({age:{$gt:5})
练习3:查询年龄是5岁、8岁、10岁的数据?
db.c1.find({a:{$in:[5,8,10]}})
练习4:只看年龄列,或者年龄以外的列(_id别管它)?
db.c2.find({}{age:1})
db.c2.find({}{age:0})
3.修改数据
基础语法:db.集合名.update(条件,新数据[是否新增,是否修改多条])
是否新增:指条件匹配不到数据则插入,true是插入,false否不插入默认 是否修改多条:指将匹配成功的数据都修改(true是,false否默认)
升级语法
db.集合名.update(条件,新数据)
{修改器:{键:值}}
| 运算符 | 作用 |
|---|---|
| $inc | 递增 |
| $rename | 重命名列 |
| $set | 修改列值 |
| $unset | 删除列 |
准备工作
use test2;
for(var i=1;i<-10;i++){
db.c3.insert({}"uname":"zs"+i,"age":i});
}
练习1:将{uname:“zs1”}改为{uname:“zs2”}
db.c3.update({uname:"zs1"},{uname:"zs2"})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAOb2GKY-1653707936498)(C:Users孙凯DesktopJava笔记MongoDBphotoupdate.png)]
发现:默认不是修改,而是替换
解决:使用升级语法 修改器
需求:使用 修改器 将zs4的姓名改为zs44
语法:db.c3.update({uname:“zs2”},{$set:{uname:“zs22”}})
练习2:给{uname:“zs10”}的年龄加2岁或者减2岁
db.c3.update({uname:"zs10"},{$inc:{age:2}})
减两岁
db.c3.update({uname:"zs10"},{$inc:{age:-2}})
练习3:修改器综合练习
插入数据:db.c4.insert({uname:“神龙教主”,age:888,who:“男”,other:“非国人”})
完成需求
uname 改成 webopenfather (修改器:$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}
})
练习4:验证语法最后两个参数
【验证】是否新增true是 false否:修改uname等于zs30的年龄30岁
找不到就插入
db.c3.update({uname:"zs30"},{$set:{age:30}},true)
【验证】是否修改多条true是,false否默认
4.删除数据
语法:db.集合名.remove(条件[,是否删除一条])
注意:是否删除一条true是,false否
小总结高级开发工程师统称,所有数据库都需要有增删改查CURD标识
MongoDB删除语法:remove
增Create
db.集合名.insert(JSON数据)
删Delete
db.集合名.remove(条件,【,是否删除一条true是false否默认】)
改Update
db.集合名.update(条件,新数据[,是否新增,是否修改多条])
升级语法db.集合名.update(条件,{修改器:{键:值}})
查Read
db.集合名.find(条件【,查询的列】)MongoDB排序&分页
准备数据:
use test3
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:"b",sex:2,age:2})
db.c1.insert({_id:3,name:"c",sex:3,age:3})
db.c1.insert({_id:4,name:"d",sex:4,age:4})
db.c1.insert({_id:5,name:"e",sex:5,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条
1、db.c1.find().sort({age:-1}).skip(0).limit(2)
2、db.c1.find().sort({age:-1}).skip(2).limit(2)
小总结
db.集合名.find()
.sort({列:1/-1}) 排序
.skip(数字) 跳过指定数量
.limit(数字) 限制查询条数
.count() 统计总数量
不够:百度
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:"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.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: "$age"
}
}
}
])
- 查询男神,女生人数,按人数升序
db.c1.aggregate([
{
$group: {
_id: "$sex",
rs: {
$sum: 1
}
}
},
{
$sort: {
rs: 1
}
}
])
}
}
}
])
- 求学生总数和平均年龄
db.c1.aggregate([
{
$group: {
_id: null,
total_num: {
$sum: 1
},
total_avg: {
a
v
g
:
"
avg: "
avg:"age"
}
}
}
])
- 查询男神,女生人数,按人数升序
db.c1.aggregate([
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: … _id: "sex",
rs: {
$sum: 1
}
}
},
{
$sort: {
rs: 1
}
}
])



