下载,安装
安装最后一步把勾去掉,会下载可视化工具很慢,卡死
配置环境变量
C:\Program Files\MongoDB\Server\5.0\bin
放到系统path目录下
检查配置是否成功
cmd 下 mondb,跳出版本号为sucess,并进入mondb操作系统
数据库增删
show dbs
查看有哪些数据库
创建
use demo
db.user.insert({"name":"xiaoyu","age":22})
先 use,然后在里面添加一条数据就创建成功了
查看
use demo
show collections
db.user.find()
先use数据库
然后展示所有集合
最后选择集合并find(),注意要加括号
我们会发现刚才添加的数据,已经自动帮我们添加了一个"_id"了
{ "_id" : ObjectId("614008f2e3373d94d7745227"), "name" : "xiaoyu", "age" : 22 }
删除
show dbs
use demo
db.dropDatabase()
先切换到demo数据库
然后db.dropDatebase()就删掉了
show dbs
use demo
show collections
db.user.drop()
这个是删除一个集合
数据增删改查
增加insert
也可以直接增加一个数组,json数组
show dbs
use demo
show collections
db.user.insert(shuju)
for循环增加
for(var i=1;i<50;i++){
if(i%2==0){db.user.insert({"name":"name"+i,"age":i,"sex":"women"+i})}
else{db.user.insert({"name":"name"+i,"age":i,"sex":"men"+i})}
}
这样就批量增加了数据
删
remove
db.user.remove({sex:"男人"})
只要符合的就全删了,所以删之前一定要先find看下对不对,哈哈
justone
加一个justOne:true就只删除一条
db.user.remove({sex:"男人"},{justOne:true})
改
set
db.user.update({sex:/men/},{$set:{"sex":"男人"}})
虽然我们匹配到了很多,但是只能更改第一个数据
改数据如果有这个字段就覆盖,没有就新增
如果不出现$set,就是整条数据全部替换
multi
set只能替换一条数据,如果要把符合的全部替换的话,就需要multi:true
db.user.update({sex:/men/},{$set:{"sex":"男人"}},{multi:true})
查find
查找所有
db.user.find()
查找指定数据
如:查找name="ruru"
db.user.find({"name":"ruru"})
结果:所有name="ruru"的数据就都出来了,name引号不加也可以的
{ "_id" : ObjectId("61401b9de3373d94d7745229"), "name" : "ruru", "age" : 32, "sex" : "women" }
{ "_id" : ObjectId("614038cc9e6dc2df9a2ffef3"), "name" : "ruru", "age" : 32 }
查询区间
如:age>20的 用$gt
db.user.find({age:{$gt:20}})
age<20的 用$lt
db.user.find({age:{$lt:20}})
age>=20 用$gte
age<=20 用$lte
10<=age<=40 中间用逗号隔开,就符合两个条件了
db.user.find({age:{$gte:10,$lte:40}})
查找name中包含ru的数据 用/ru/表示,正则表达差不多
db.user.find({name:/ru/})
查找name中以r开头的数据 用/^r/表示
db.user.find({name:/^r/})
查找name中以u结尾的数据 用/u$/表示
db.user.find({name:/u$/})
查找指定列name,age数据 意思查找出来的数据只显示我指定的内容,这里就出来的数据只显示name,age,不显示其它字段
db.user.find({},{name:1,age:1})
排序 意思按年龄大小排序,1表示升序,-1表示降序
db.user.find().sort({age:1})d
查询前5条数据 用limit(num)表示
db.user.find({name:/u$/}).limit(5)
查询5条之后的数据 用skip(num)表示
db.user.find().skip(5)
or或者查询
db.user.find({$or:[{age:20},{sex:/men/}]})
统计数量 所有查询后面加一个.count就会出现数量了
db.user.find({$or:[{age:20},{sex:/men/}]}).count()
索引
当我们的数据非常大的时候,如果从中找一条数据,mongo就会查询每一条语句来判断,这会浪费内存和时间,所以这里我们就要设置索引,来达到快速搜寻到查询结果
查看已经有的索引
db.user.getIndexes()
输出 _id是系统自带的索引,而且删除不了
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
创建索引
db.user.createIndex( { name: 1 } )
好了,我们创建了name的索引,所以我们以后用name字段查询的时候就会非常的快,1表示升序,-1表示降序
复合索引
db.user.createIndex( { name: 1,age:1 } )
需要注意的是符合索引创建后,第一个字段和复合字段查询的时候都会时间很短,但是单独查询后面字段的时候(age)就会很长时间,就是岂不到索引的功能
删除索引
db.user.dropIndex({name:1})
这样就删掉了
唯一索引
给一个字段设置了唯一索引之后,这个字段就不能够重复了,就这么简单
db.user.createIndex( { name: 1 },{unique:true} )
好了,下面你再建一个name和前面的字段一样的试试,保证报错
账户权限配置
创建超级管理员
use admin
先进入admin数据库
db.createUser({
user:'admin',
pwd:'xiaoyu446688',
roles:[{role:'root',db:'admin'}]
})
创建好之后可以show users 查看有哪些用户
{
"_id" : "admin.admin",
"userId" : UUID("a91c78d8-3d2b-4e4a-8fc6-7db0bf8c044a"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
这里暂时只有一个admin
开启验证
虽然我们创建了账户,但是数据库没有开启验证所以还是可以直接进
C:\Program Files\MongoDB\Server\5.0\bin\mongod.cfg
修改bin目录下的mongod.cfg文件
security:
authorization: enabled
找到security并开启authorization: enabled
重启服务
改好配置之后还要重启服务
win+R --> services.msc 然后找到MongoDb服务,重启就行了
重新连接mongo
mongo admin -u admin -p xiaoyu446688
mongo admin 固定
-u 用户名
-p 密码
如果访问远程数据库,格式如下
mongo 192.168.1.200:27017/test -u user -p password
给users(任意指定一个)数据库创建一个用户
use demo
db.createUser({user:"zhangsan",pwd:"123456",roles:[{role:"dbOwner",db:"demo"}]})
好了,我们现在用这个账户登陆试试看
mongo demo -u zhangsan -p 123456
然后show dbs 我们会发现zhangsan只有一个demo数据库
删除用户
db.dropUser('zhangsan')
关系型数据表与表之间的几种关系
聚合管道
可以对集合中的文档进行变换和组合
实际项目中用法:表关联查询,数据的统计
基本写法如:aggregate后面跟条件
db.order.aggregate([
{
$project:{trade_no:1,all_price:1}
}
])
常见管道操作符
pipe | description | |
---|---|---|
$project | 增加、删除、重命名字段 | |
$match | 条件匹配,只满足条件的文档才能进入下一阶段 | |
$limit | 限制结果的数量 | |
$skip | 跳过文档的数量 | |
$sort | 条件排序 | |
$group | 条件组合结果 | |
$lookup | 用以引入其它集合的ssh数据 | |
$project
db.order.aggregate([{$project:{trade_no:1,all_price:1}}])
这句话的意思是,创建一个数组,然后里面的内容显示trade_no,all_price
{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
trade_no: '111',
all_price: 100 }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
trade_no: '222',
all_price: 90 }
{ _id: ObjectId("61414d228f1df7a4130de57d"),
trade_no: '333',
all_price: 20 }
$match
筛选符合条件的数据
db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$mathch:{$gte:{all_price:90}}}
])
all_price》90
这下数据更少了,更精确了
{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
trade_no: '111',
all_price: 100 }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
trade_no: '222',
all_price: 90 }
$group
这是一个分组命令,把符合条件的分到一组
db.order_item.aggregate([
{$group:{_id:"$order_id",total:{$sum:"$num"}}}
])
_id 是给order_id分类,total是统计对应order_id的num总数
$sort
是一个排序的方法
db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$sort:{all_price:-1}}
])
意思就是按all_price降序排列,1是升序
{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
trade_no: '111',
all_price: 100 }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
trade_no: '222',
all_price: 90 }
{ _id: ObjectId("61414d228f1df7a4130de57d"),
trade_no: '333',
all_price: 20 }
$limit
就是显示几条
db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$sort:{all_price:-1}},
{$limit:2}
])
这里就显示匹配的前2条
$skip
表示跳过几条
db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$sort:{all_price:-1}},
{$skip:1}
])
这里就是跳过第一条
$lookup
就是把两个集合关联起来
db.order.aggregate([
{$lookup:{
from:"order_item",
localField:"order_id",
foreignField:"order_id",
as:"items"
}}
])
from就是和哪个集合关联
localField,就是本集合内的关联项
foreignField,就是关联集合的关联想
最后以as字段出现,意思就是localField和foreignField值相同的归集到一个字段
{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
order_id: '1',
uid: 10,
trade_no: '111',
all_price: 100,
all_num: 2,
items:
[ { _id: ObjectId("61414d778f1df7a4130de57e"),
order_id: '1',
title: '商品鼠标1',
price: 50,
num: 1 },
{ _id: ObjectId("61414dfb8f1df7a4130de57f"),
order_id: '1',
title: '商品鼠标2',
price: 50,
num: 1 },
{ _id: ObjectId("61414dfb8f1df7a4130de580"),
order_id: '1',
title: '商品鼠标3',
price: 20,
num: 1 } ] }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
order_id: '2',
uid: 7,
trade_no: '222',
all_price: 90,
all_num: 2,
items:
[ { _id: ObjectId("61414dfb8f1df7a4130de581"),
order_id: '2',
title: '牛奶',
price: 50,
num: 1 },
{ _id: ObjectId("61414dfb8f1df7a4130de582"),
order_id: '2',
title: '酸奶',
price: 40,
num: 1 } ] }
{ _id: ObjectId("61414d228f1df7a4130de57d"),
order_id: '3',
uid: 9,
trade_no: '333',
all_price: 20,
all_num: 6,
items:
[ { _id: ObjectId("61414e74f86d08f13497c80b"),
order_id: '3',
title: '矿泉水',
price: 2,
num: 1 },
{ _id: ObjectId("61414e88f86d08f13497c80c"),
order_id: '3',
title: '毛巾',
price: 3,
num: 5 } ] }
数据库的备份和还原
打开cmd无需进入数据库
备份
mongodump -h dbhost -d dbname -o dbdirectory
mongodump -h 127.0.0.1:27017 -d demo -o D:\github\Docusaurus_blog\docs\nodejs
还原
mongorestore -h dbhost -d dbname dbdirectory