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"
}]
})