一、 查看数据库
Show databases
二、 选择数据库
Use 数据库名
PS:在数据库中,选择不存在的数据库不会报错,后期当该数据库有数据时,系统自动创建 (隐式创建)
三、 查看集合
Show collections
四、 创建集合
db.createCollection(“集合名”)
五、 删除集合
db.集合名.drop()
MongoDB文档增删改查
1. 增
db.集合名.insert({uname:””,age:xx})
Ps:数据库和集合不存在,隐式创建;对象的键统一不加引号,方便看,但是查看集合数据时系统会自动加;mongodb会自动为每条数据自动生成一个唯一的_id,其组成为时间戳+机器+PID+计数器。可自定义_id键,只需要给插入的json数据增加_id键即可覆盖(不推荐)
如何插入多条记录?
db.集合名.insert([
{ uname:””,age:xx },
{ uname:””,age:xx },
{ uname:””,age:xx }
])
如何快速插入10条数据——mongodb底层使用JS引擎实现的,所以支持部分js语法
for(var i=1; i<=10;i++){
db.集合名.insert({uname:”a”+i, age:i})
}
2. 查看
db.集合名.find({查询条件},{查询列})
db.集合名.find().pretty() ——查询结果格式化
查询条件:
查询age=6的数据——db.集合名,find({age:6})
查询age=6且sex=男的数据 {age:6, sex:”男”}
查询age>5的数据——db.集合名.find({键:{运算符:值}})
db.集合名.find({age:{$gt:5}})
查询age为5/8/10的数据——db.集合名.find({age:{$in:[5,8,10]}})
Ps:运算符
大于 $gt
大于等于 $gte
小于 $lt
小于等于 $lte
不等于 $ne
In $in
Not in $nin
查询列:
{age:1}只显示age列——db.集合名.find({},{age:1})
{age:0}除了age列——db.集合名.find({},{age:0})
不管怎么写系统自定义的_id都会在
3. 改
db.集合名.update(条件,新数据[,是否新增,是否修改多条])
是否新增:指条件匹配不到数据则插入(true插入,false不插入默认)
是否修改:指将匹配成功的数据都修改(true修改,false不修改默认)
db.c3.update({uname:”zs1”},{uname:”zs2”})——不是修改,是替换
使用修改器:
$inc 递增
$rename 重命名列
$set 修改列值
$unset 删除列
db.c3.update({uname:”zs1”},{KaTeX parse error: Expected 'EOF', got '}' at position 18: …t:{uname:”zs2”}}̲) ——多条数据,默认只改…inc:{age:2}})
年龄减少2岁——db.c3.update({uname:”zs1”},{KaTeX parse error: Expected 'EOF', got '}' at position 13: inc:{age:-2}}̲) 举例实现以下需求: Una…set:{uname:”神主教”}},
{KaTeX parse error: Expected 'EOF', got '}' at position 13: inc:{age:11}}̲, {rename:{who:”sex”}},
{$unset:{other:true}}
})
db.c3.update({},{uname:”zs30”},{KaTeX parse error: Expected 'EOF', got '}' at position 13: set:{age:30}}̲) 数据不存在,不修改 db…set:{age:30}},false) 数据不存在,不修改
db.c3.update({},{uname:”zs30”},{$set:{age:30}},true) 数据不存在,新插入到数据库
db.c3.update({},{KaTeX parse error: Expected 'EOF', got '}' at position 13: set:{age:10}}̲,fasle,fasle) 只…set:{age:10}},fasle,true) 修改多条
4. 删
db.集合名.remove(条件[,是否删除一条])
是否删除一条true是,false否默认
db.c3.remove({},true) 删除一条
db.c3.remove({},false) 删除全部
Mongodb排序和分页
排序
db.集合名.find().sort(JSON数据)
说明:键就是要排序的列/字段、值:1升序 -1降序
年龄升序
db.c1.find().sort({age:1})
年龄降序
db.c1.find().sort({age:-1})
分页
Db.集合名.find()sort().skip(数字).limit(数字)
Skip跳过指定数量(可选),limit限制查询的数量
降序查询2条
Db.c1.find().sort({age:-1}).skip(0),limit(2)
降序跳过2条并查询2条
Db.c1.find().sort({age:-1}).skip(2).limit(2)
需求:数据库1-10数据,每页显示2条(5页)
Db.集合名.find().skip().limit(2)
Skip计算公式:(当前页-1)*每页显示条数
聚合查询
Db.集合名.aggregate([
{管道:{表达式}}
])
常用管道:
$group 将集合中的文档分组,用于统计结果
$match 过滤数据,只要输出符合条件的文档
$sort 聚合数据进一步排序
$skip 跳过指定文档数
$limit 限制集合数据返回文档数
常用表达式:
$sum 总和 $sum:1同count表示统计
$avg 平均
$min 最小值
$max 最大值
统计女生、男生的总年龄
db.c1.aggregate([
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{ _id:”sex”, //分组方式
rs:{
s
u
m
:
”
sum:”
sum:”age”} //多加一列
}
}])
统计男生、女生总人数
db.c1.aggregate([
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{ _id:”sex”, //分组方式
rs:{$sum:1} //多加一列
}
}])
求学生总数和平均年龄
db.c1.aggregate([
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: …组 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: group:{ _id:”sex”, //不分组
rs:{$sum:1}
}
},
{
$sort:{rs:1}
}])
优化索引
索引是一种排序好的便于快速查询的数据结构
db.集合名.createIndex(待创建索引的列)[,额外选项]
参数:待创建索引的列:{键:1,…,键-1}
说明:1升序-1降序,例如{age:1}表示创建age索引,并按照升序的方法存储
额外选项:设置索引的名称或者唯一索引
删除索引:
全部删除:db.集合名.dropIndexes()
删除指定: db.集合名.dropIndexes(索引名)
查看索引:db.集合名.getIndexes()
给name添加普通索引
db.c1.createIndex({name:1})
删除name的索引
db.dropIndex(“name_1”)
给name创建索引并起名字name_c1
db.c1.createIndex({name:1},{name:”name_c1”})
给name和age创建复合\组合索引
db.集合名. createIndex ({键1:存储方式,键2:存储方式})
db.c1.createIndex({name:1,age:1})
创建唯一索引
db.集合名. createIndex (待添加索引的列,{unique:列名})
db.c1.createIndex({name:1},{unique:”name”})
分析索引
db.集合名.find().explain(“executionStats’”)
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’)
选择规则(如何选择合适的列创建索引)
为常做条件、排序、分组、联合操作的字段建立索引
选择唯一性索引(同值较少如性别字段)
选择较小的数据列,为较长的字符串使用前缀索引(索引文件更小)
权限机制
使用权限机制,开启验证模式
db.createUser({
“user”:”账号”,
“pwd”:”密码”,
“roles”:[{
role:“角色”,
db:”所有数据库”
}]
})
角色种类:
超级用户角色:root
数据库角色:read、readwrite
数据库管理角色:dbAdmin、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
角色说明:
Root:只在admin数据库中可用,超级账号,超级权限
Read:允许用户读取指定数据库
Readwrite:允许用户读写指定数据库
开启验证模式指用户需要输入账号密码才能登陆使用
步骤:
- 添加超级管理员
- 退出卸载服务
- 重新安装需要输入账号密码的服务(注在原安装命令基础上加—auth即可)
- 启动服务->登陆测试
- Mongo
use.admin
db.createUser({
“user”:”admin”,
“pwd”:”admin888”,
“roles”:[{
role:’root’,
db:”admin”
}]
})
Ps:早起版本默认看不到admin用户 - Bin\mongod –remove
Ps:dos窗口必须用管理员身份运行 - Bin\mongod --install --dbpath D:\Mongo\data --logpath D:\Mongo\logs\mongo2.log —auth
- Net start mongodb
方法1:Mongo服务器IP地址:端口/数据库 -u 用户名 -p 密码
方法2:先登录 选择数据库 输入db.auth(用户名,密码)
添加用户并设置权限
Use shop
//shop1
db.createUser({
“user”:”shop1”,
“pwd”:”admin888”,
“roles”:[{
role:’read,
db:”shop”
}]
})
//shop2
db.createUser({
“user”:”shop2”,
“pwd”:”admin888”,
“roles”:[{
role:’readwrite,
db:”shop”
}]
})
备份数据库mongodump
Mongodump -h -prot -u -p -d -o
-h host服务器IP地址,一般不写默认本机
-port 端口,一般 默认27017
-u user 账号
-p pwd 密码
-d database 数据库,数据库不写则导出全部
-o open 备份到指定目录下
备份所有数据
Bin目录下
Mongodump -u admin -p admin888 -o D:\mongodb\bak
备份指定数据
Mongodump -u admin -p admin888 -d shop -o D:\mongodb\bak2
还原数据库mongorestore
Mongorestore -h -port -u -p -d –drop 备份数据目录
-d 不写则还原全部数据
–drop 先删除数据库在导入
还原所有数据
Mongorestore -u admin -p admin888 --drop D:\mongodb\bak
还原指定数据
Mongorestore -u shop2-p admin888 -d shop --drop D:\mongodb\bak2\shop