MongoDB总结

基本操作

show databases;

use databasename;

db.dropDatabase();

show collections;

db.createCollection('collectionname');

db.collectionname.drop();

CURD

增:

集合存在则直接插入数据,不存在则隐式创建

collections为集合名

db.collection.insert({name:"jack"})	//单个JSON插入
db.collection.insert([{name:"jack"}.{name:"tom"}]) //多个JSON插入
for(var i =0;i<5;i++){
db.collection.insert({name:"jack"})
}//快速插入多个数据

改:

db.collection.update(条件,新数据[,是否新增,是否修改多条数据])
//是否新增:true则为插入,默认flase为不插入
//是否修改多条:匹配到的数据都修改,默认true为是,false为否
db.collection.update({name:"tom"},{name:"saily"},false,true)
//这样子为将tom的那条数据替换成{name:"saily"},默认为替换不是修改

下面运算符可在新数据里面使用

运算符 作用
$inc 递增
$rename 重命名列
$set 修改列值
$unset 删除列
//$inc使用,将age增加3
db.collection.update({name:"tom"},{$inc:{age: 3}})
//$inc使用,将age减少3
db.collection.update({name:"tom"},{$inc:{age: -3}})
//$rename使用,修改name命名为uname
db.collection.update({name:"tom"},{$rename:{name:"uname"}})
//$set使用,将修改name为saily
db.collection.update({name:"tom"},{$set:{name:"saily"}})
//$unset使用,将age字段删除,true为删除
db.collection.update({name:"tom"},{$unset:{age:true}})
//一次性写多个修改器
db.collection.update({name:"tom"},{
$inc:{age: 3},
$set:{name:"saily"},
$rename:{name:"uname"},
$unset:{age:true}
})

查:

db.collection.find(条件[,查询的列])
//格式化查询文档
db.collection.find().pretty();

//查询age为6的数据
db.collection.find({age:6})

//查询age为6和sex为male的数据
db.collection.find({age:6,sex:"male"})

//查询的列 表示 结果筛选
//查询name为tom只显示age字段
db.collection.find({name:"tom"},{age:1})

//查询name为tom除了age字段都显示
db.collection.find({name:"tom"},{age:0})

删:

db.collection.remove(条件[,是否删除一条])
//删除集合中所有文档
db.collection.remove({})
//是否删除一条,只删除一条为true,默认为否删除全部false

排序:

//JSON数据里面根据键值排序,键为字段名,值为1则升序排序,值为-1则为降序排序
db.collectionname.find().sort(JSON数据)

//年龄按降序排序
db.test.find().sort({age: -1});

Limit与Skip方法:

db.collectionname.find().sort().skip(数字).limit(数字);
//skip跳过指定数量文档(可选),limit限制查询的数量

//降序查询2条数据
db.test.find().sort({age:-1}).limit(2);

//降序查询2条而且跳过2条数据
db.test.find().sort({age:-1}).skip(2).limit(2);

聚合查询:

db.collectionname.aggregate([
{管道:{表达式}}
...
])

常用管道

方法 作用
$group 将集合中的文档分组,用于统计结果
$match 过滤数据,只要输出符合条件的文档
$sort​ 聚合数据进一步排序
$skip 跳过指定的文档数
$limit 限制集合数据返回文档数

常用表达式

方法 作用 用法
$sum 总和 $sum:1 同count表示统计
$avg 平均
$min 最小值
$max 最大值
//统计sex的总人数
db.test.aggregate([
{
$group:{
_id: "$sex", //按照sex列的顺序分组
rs: {$sum:1} //rs为统计总和的结果
}
}
])
//统计所有人数的平均年龄
db.test.aggregate([
{$group:{
_id: null,
totalNum: {$sum: 1},
avgAge: {$avg: "$age"}
}}
])
//查询每个sex的人数,按人数升序排序
db.test.aggregate([
{
$group:{
_id: "$sex",
totalNum: {$sum:1},
}
},
{
$sort:{totalNum:1}
}
])

索引:

//创建索引语法
db.collectionname.createIndex(待创建索引的列[,额外选项])
//待创建索引的列: {键:1,...,键:-1} 1为按升序创建索引,-1位按降序创建索引
//额外选项:设置索引的名称或者唯一索引等 {name:indexname,unique:列名}

//删除索引语法

//全部删除
db.collectionname.dropIndexes()
//部分删除
db.collectionname.dropIndex('索引名')

//查看索引语法
db.collectionname.getIndexes()
//创建多个索引
db.collectionname.createIndex({name:1,age:1})

//创建唯一索引
db.collectionname.createIndex({name:1},{unique:age})

分析索引:

db.collectionname.find().explain('executionStats');

//COLLSCAN 全表扫描
//IXSCAN 索引扫描
//FETCH 根据索引去检索指定的document

IMG_0512

//未添加索引寻找
db.test.find({name:"tom"}).explain('executionStats');
//添加索引寻找
db.test.find({name:"tom"}).explain('executionStats');

权限机制:

use admin;
db.createUser({
"user": "huangjiahui",
"pwd": "huangjiahui",
roles:[{
role: "readWrite",
db: "huangjiahui"
}]
});
//或者
db.createUser({
"user": "账号",
"pwd": "密码",
roles:[{
role: "角色",
db: "所属数据库"
},{
role: "readWrite",
db: "zdnfcj"
},
]
})

//指定某个数据库创建用户,要到当下的数据库下创建用户
//admin下的system.users集合能看到所有用户

#角色种类

超级用户角色:root

数据库用户角色:read、readWrite

数据库管理角色:dbAdmin、userAdmin

集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager

备份恢复角色:backup、restore

所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

通过root登录

  • mongo ip:port/database -u user -p pwd
  • 先登录 mongo,选择admin数据库,db.auth(user,pwd)

备份还原:

备份

mongodump -h -port -u -p -d -o

//语法说明
-h host ip
-port port
-u user
-p pwd
-d database
-o open ./xxx/ 备份路径文件夹

还原

mongorestore -h -port -u -p -d --drop 备份数据目录

-d 不写则还原全部数据
--drop 先删除数据库再导入