安装
mongodb服务:
sudo service mongod/mongodb start
sudo service mongod/mongodb stop
sudo service mongod/mongodb restart
配置文件路径 /etc/mongod.conf|mongodb.conf
链接:
mongo
mongo -h ip:port
mongo --host ip --port port
mongodb的操作:
数据库:
show dbs 查看数据库
db 查看当前数据库
use dbname 切换数据库
db.dropDatabase() 删除当前数据库
db.stats()
集合:
db.createCollecrion('colname',属性)
db.createCollecrion('colname')
db.createCollection('colname',{capped:true,size:字节大小,max:最大文档数量})
db.colname.drop()
增:
db.colname.insert(docment)
db.colname.insert([docment,docment,...])
db.colname.insertOne(docment)
db.colname.insertMany([docment,docment,...])
删除:
db.colname.remove({})
db.colname.remove({条件})
db.colname.remove({条件},1) -> db.colname.remove({条件},{justOne:true})
修改:
更新文档中的某些键
db.colname.update({条件},{$set:{键:值}})
全文档更新(如果没找到,则作为一条新的数据插入)
db.colname.update({条件},{键:值})
save
case1:假如我们要更新的文档——id存在则修改
case2:假如我们要更新的文档——id不存在,则作为新的文档插入
db.colname.save({_id:'',键:值,键:值.....})
查:
db.colname.find() -> db.colname.find({})
db.colname.find({条件}) -> db.colname.find({age:20,name:'xxx'})
限制查询:limit
db.colname.find({条件}).limit(num) -> db.colname.find({age:20,name:'xxx'}).limit(3)
跳过:skip
db.colname.find({条件}).skip(num)
save结合使用:
db.colname.find({条件}).skip(num).limit(num)
排序:sort [1:升序,-1:降序]
db.colname.find({条件}).sort({键:方向})
投影: project(0:不显示,1:显示)
db.colname.find({},{字段:1,字段:1,字段:0})
db.colname.find({},{字段:0})
去重:distinct
db.colname.distinct('键',{条件}}) -> db.colname.distinct('age',{name:'xxx'})
统计:count()
db.colname.find().count()
db.colname.count({条件}) -> db.colname.find({条件}).count()
返回所有键位什么什么的类型的文档 type
db.colname.find({键:{$type:'类型(string,int)'}})
比较运算符
$lt 小于 -> db.colname.find({salary:{$lt:10000}}).count()
$lte 小于等于 -> db.colname.find({salary:{$lte:10000}}).count()
$gt 大于
$gte 大于等于
$ne 不等于
逻辑运算符
$or -> db.colname.find({$or:[{salary:{$gt:10000}},{name:'李明'}]})
范围运算符
$in -> db.colname.find({键:{$in:[19,20,23]}})
$nin -> db.colname.find({age:{$nin:{19,20,23}}})
正则查询:(必须是字符串)
db.colname.find({name:/^李.*?/})
db.colname.find({name:$regex:'^李.*?'})
自定义查询:
db.colname.find({$where:function(){reture this.name=='李明'}})
db.colname.find({$where:function(){reture this.age > 20}})
聚合操作:
管道:
$group (分组)
统计班级人数:
-> db.colname.aggregate([{$group:{_id:'$class',count:{$sum:1}}])
班级的平均年龄:
-> db.colname.aggregate([{$group:{_id:'$class',avgage:{$avg:'$age'}}])
返回班级的最大年龄,最小年龄
db.colname.aggregate([{$group:{_id:'$class',maxage:{$max:'$age'}}])
db.colname.aggregate([{$group:{_id:'$class',maxage:{$min:'$age'}}])
$project (只返回年龄和性别)
db.colname.aggregate([{$project:{age:1,gender:1,_id:0}}])
$match (返回年龄在大于50,小于100)
db.colname.aggregate([{$match:{age:{$gt:50,$lt:100}}}])
$skip与$limit限制查询
db.colname.aggregate([{$match:{age:{$gt:30}}},{$limit:3}])
db.colname.aggregate([{$match:{age:{$gt:30}}},{$skip:3}])
db.colname.aggregate([{$match:{age:{$gt:30}}},{$skip:3},{$limit:3}])
$unwind:将文档中的键对应的数组,拆分程单条独立的数据
db.colname.aggregate([{$unwind:'$tags'}])
$sort 排序 (返回年龄在大于50,小于100,降序排序)
db.colname.aggregate([{$match:{age{$gt:50,$lt:100}}},{$sort:{age:-1}}])
(返回年龄在大于50,小于100,升序排序)
db.colname.aggregate([{$match:{age{$gt:50,$lt:100}}},{$sort:{age:1}}])
聚合函数:
$sum
-> db.colname.aggregate([{$group:{_id:'$class',count:{$sum:1}}])
$avg
-> db.colname.aggregate([{$group:{_id:'$class',avgage:{$avg:'$age'}}])
$min
-> db.colname.aggregate([{$group:{_id:'$class',maxage:{$min:'$age'}}])
$push:
根据班级进行分组,返回班级下所有的搬家同学的姓名
-> db.colname.aggregate(pP$group:{_id:'$class_',names:{$push:'$name'},age:{$push:'$age'}})
$last:
返回接总的最后一个name
db.colname.aggregate([{$group:{_id:'null',last:{$last:'$name'}}}])
$first:
返回集合总的第一个name
db.colname.aggregate([{$group:{_id:'null',first:{$first:'$name'}}}])
索引:
_id索引:这个在插入文档时会自动创建
普通索引:
单键索引:
-> db.colname.createIndex({'索引键':方向})
复合索引:
-> db.colname.createIndex({'索引键':方向,'索引键':'方向'...})
子文档索引:
{
class:'1804',
student:{
name:'李明',
age:20,
email:'llw@qq.com'
adress:'北京'
}
}
db.colname.createIndex({'student.name:1,'student.email:-1'})
使用 db.colname.find({student.name:'李明','student.email':'llw@qq.com'})
数组索引:
db.colname.createIndex({tags:1})
全文索引:
{
'content':'abc 123 李明 1804班'
}
db.colname.createIndex({content:'text'...})
使用
db.colname.find({$text:{$search:'关键词'}})
属性:
backgroud 在后台创建索引
unique 唯一索引
name 给索引起一个名称
sparse 稀疏索引(if set 了这个属性,文档中如果含有这个索引键,那么创建索引,else不创建)
TTL expireAfterSeconds 秒: 该属性设置文档在集合中存活的时间,超时,删除
注意:我们直接插入一个时间,会跟文档中真正插入的时间,相差8小时
TTL补充:
_id 不能设置为日期索引
不能将已创建的索引直接修改位时间索引,只能删除,重新创建
TTL 不能是符合索引
删除索引
db.colname.dropIndex('索引名')
db.colname.dropIndexs()
查看集合中的所有索引
db.colname.getIndexs()
查看集合中的索引的总大小
db.colname.totalIndexSize()
强制索引
db.colname.find({条件}).hint('索引名')
重建索引
db.colname.reIndex()
建立索引的注意事项、优点、缺点:
优点:相当于创建了一个目录,能够提高查找的效率
缺点:1.对于插入、删除、修改数据会变慢,因为在做插入、删除、修改数据的时候,索引也会随之变化
这样会降低效率 2.创建索引会产生额外的数据,增加我们对硬件的要求,会占额外占用内存
注意事项:
1.尽量减少创建不必要的索引
2.经常变动的键不必要创建索引
3.不会成为查询条件的值不需要创建索引
4.mongodb集合中最大的索引个数不能超过64个,
索引的名称不能超过128个字符,符合索引最大只能有31字段
5.不能命中索引的情况:$in $nin 范围运算符,以及比较运算符...
6.mongodb中索引放在内存中,必须确保索引的大小不会超过内存,
如果超过内存最大限制,mongodb会自动删除一些索引
创建用户:
普通用户、超级管理员
创建超级管理员
root:
read:
readwrite
use admin
db.createUser({
'user':'username',
'pwd':'password',
'roles':[{'role':'root',db:'admin'}]
})
打开mongodb的安全设置
sudo vim /etc/mongod.conf
高版本
security:
authorization:enabled
或者:
1. sudo vim /etc/mongodb.conf
低版本
auth=true
2.修改完毕之后重置:sudo service mongodb restart
3.使用超管登录
mongo -u 用户名 -p 密码 --authenticationDatabase 'admin'
创建一个普通用户
use dbnamedb.createUser({
'user':'username',
'pwd':'password',
'roles':[{'role':'readWrite',db:'dbname'}]
})
mongo -u 用户名 -p 密码 --authenticationDatabase'dbname'
修改用户信息
修改密码
db.updateUser('username',{pwd:'newpassword'})
修改用户名
db.updateUser('username',{user:'newusername'})
删除权限
db.revokeRolesFromUser('username',[{role:'权限',db:'dbname'}])
添加权限
db.grantRolesToUser('username',[{role:'权限',db:'dbname'}])
删除用户
db.dropUser('username)
方式二
use admin
db.sysem.users.remove({user:'username'})
查看所有的用户
use admin
db.system.users.find()
mongodb数据备份
mongodump -h 127.0.0.1:27017(本地可忽略) -d dbname -o 备份文件的路径
mongodump备份数据库下的集合
mongodump -h 127.0.0.1:27017(本地可忽略) -d dbname colname -o 备份文件的路径
备份所有的数据库
mongodump -h 127.0.0.1:27017(本地可忽略) -o 备份文件的路径
恢复数据库
mongorestore -h 127.0.0.1:27017(本地可忽略) -d dbname --dir 备份文件的路径
恢复数据下的集合
mongorestore -h 127.0.0.1:27017(本地可忽略) -d dbname colname --dir 备份文件的路径
恢复所有的数据库
mongorestore -h 127.0.0.1:27017(本地可忽略) --dir 备份文件的路径
数据的导出(json、csv)
导出json数据
mongoexport -d dbname -c colname -o ~/桌面/dump/名称.josn --type json、csv
导出csv数据
mongoexport -d dbname -c colname -o ~/桌面/dump/名称.csv --type csv -f '键名,键名...'
导入数据(json、csv)
导入json数据
mongoimport -d dbname-c colname --file ~/桌面/dump/名称.json --type json
导入csv数据
mongoimport -d dbname -c colname --file ~/桌面/dump/名称.csv --type csv - filed'键名,键名...'
mongodb状态检测
mongostat
mongotop
副本集
目的:
1.防止数据灾害
2.实时备份,实现主从节点数据一致性
3.读写分离
4.无诺机行为
5.分担主节点的压力
缺点:具有中心化,所有的增删改操作都需要在主节点完成,
对主节点的压力大,对主机的性能要求较高
如果实现副本集?
开始mongodb服务(至少俩个)
mongod --bind_ip ip --port port --dbpath 数据存放的路径 --replSet res0
...
链接mongo服务
mongo -- host ip --port port
确定主节点
rs.initiate()
添加从节点
rs.add('ip:port')
激活从节点
rs.slaveOk()