mongodb 的总结

mongodb里面不需要创建表/集合,他自动就会有的。
1.安装
2.mongodb服务:
sudo service mongod/mongodb start
sudo service mongod/mongodb stop
sudo service mongod/mongodb restart
配置文件路径 /etc/mongod.conf|mongodb.conf
3.连接:
mongo
mongo -h ip:prot
mongo --host ip --port port
4.mongodb的操作:
数据库:
  show dbs
db
use dbaname
db.dropDatabase()
db.stats()
集合:
 db.createCollection('colname',属性)
db.createCollection('colname')
db.createCollection('colname',{capped:true,size:字节大小,max:最大文档数量})
db.colname.drop()

文档的操作:
docment = {
name:'xxx',
age:20,
}
增:
db.colname.insert(docment)
db.colname.insert([docment,docment1,....])
db.colname.insertOne(docment)
db.colname.insertMany([docment,docment1,....])
删除:
db.colname.remove({})
db.colname.remove({条件})
db.colname.remove({条件},1) -> db.colname.remove({条件},{justOne:true})
修改:

更新文档中的某些键

db.colname.update({条件},{$set:{键:值}})

全文档更新

db.colname.update({条件},{键:值})

全文档更新(如果没找到,则作为一条新的数据插入)

db.colname.update({条件},{键:值},{upsert:true})

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'}})
限制查询:
db.colname.find({条件}).limit(num) - > db.colname.find({age:20,name:'xxx'}}).limit(3)
跳过:skip
db.colname.find({条件}).skip(num)
结合使用:(返回符合条件的结果,从num1开始,返回num2条数据)
db.colname.find({条件}).skip(num1).limit(num2)
排序:sort (1:升序,-1:降序)
db.colname.find({条件}).sort({键:方向})
投影:project (0:不显示,1:显示)
docment = {
_id:'xklsancniwknc'
name:'xxx',
age:20,
gender:'男',
class:'1804'
}
db.colname.find({},{name:1,age:1,_id:0})
db.colname.find({},{name:0})

distinct 去重

db.colname.distinct('键',{条件}) -> db.colname.distinct('age',{name:'lisi'})

count() 计算总数

db.colname.find().count()
db.colname.count({条件}) -> db.colname.find({条件}).count()

$type:返回所有键为字符串类型的文档

db.colname.find({键:{$type:'string'}})

比较运算符

= -> db.colname.find({name:'xxx'}).count()
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:'liming'}]})

范围运算符

in -> db.colname.find({age:{in:[19,23,30]}})
nin -> db.colname.find({age:{nin:[19,23,30]}})

正则查询:(一定是字符窜)

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

聚合操作:

管道

groupproject matchskip limitunwind $sort

函数

sumavg maxmin pushlast first docment = { _id:'xklsancniwknc' name:'xxx', age:20, gender:'男', class_:'1804' }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_',minage:{min:'age'}}}])

$push: 根据班级进行分组,返回班级下所有同学的姓名,返回的是一个数组

db.colname.aggregate([{group:{_id:'class_',names:{push:'name'},ages:{push:'age'}])

last:返回集合总的最后一个name

db.colname.aggregate([{group:{_id:'null',last:{last:'$name'}}}])

first:返回集合总的第一个name

db.colname.aggregate([{group:{_id:'null',first:{first:'name'}}}])project (只返回年龄和性别)
db.colname.aggregate([{project:{age:1,gender:1,_id:0}}])match:过滤 (返回年龄在大于50,小于100)
db.colname.aggregate([{match:{age:{gt:50,lt:100}}}])sort 排序 (返回年龄在大于50,小于100,)
降序排列
db.colname.aggregate([{match:{age:{gt:50,lt:100}}},{sort:{age:-1,..}}])
升序排列
db.colname.aggregate([{match:{age:{gt:50,lt:100}}},{sort:{age:1,..}}])
unwind:将文档中的键对应的数组,拆分成单条独立数据 docment = { _id:'xklsancniwknc' name:'xxx', age:20, gender:'男', class_:'1804', tags:['python','人工智能','mongodb'] } db.colname.aggregate([{unwind:'$tags'}]) 结果如下:
docment = {
id:'xklsancniwknc'
name:'xxx',
age:20,
gender:'男',
class
:'1804',
tags:'python',
}
docment = {
id:'xklsancniwknc'
name:'xxx',
age:20,
gender:'男',
class
:'1804',
tags:'人工智能',
}
.....

skip与限制查询

db.colname.aggregate([{match:{age:{gt:30}}},{limit:3}]) db.colname.aggregate([{match:{age:{gt:30}}},{skip:2}])
db.colname.aggregate([{match:{age:{gt:30}}},{skip:2},{limit:3}])

注意:skip与limit有先后顺序(顺序不同,会影响结果)

索引:(mongodb的索引存放在内存中)

id索引:这个在插入文档的会自动创建
普通索引:
单键索引:
   db.colname.createIndex({'索引键':方向})
  复合索引:
   db.colname.createIndex({'索引键':方向,'索引键':'方向',..})
子文档索引:
{
class
:'1804',
students:{
name:'liming',
age:20,
email:'nxkj@qq.com'
adress:'北京'
}
}
db.colname.createIndex({'students.name':1,'students.email':-1})
db.colname.find({'students.name':'liming','students.email':'nxkj@qq.com'})
数组索引:
db.colname.createIndex({tags:1})
全文索引:(在一个集合中只能创建一个)
{
'content':'abc 123 李某某 1804 班'
}
db.colname.createIndex({content:'text',...})
使用
db.colname.find({text:{search:'关键词'}})
属性:
background 在后台创建索引
unique 唯一索引
name 给索引起一个名称
sparse 稀疏索引(if 设置了这个属性,文档中如果含有这个索引键,那么创建索引,else 不创建)
TTL expireAfterSeconds 秒 :改属性设置文档在集合中存活的时间,超时,则删除
注意:(我们直接插入一个时间,会跟文档中正真插入的时间,相差8小时。)
TTL补充:
_id 不能设置为日期索引
不能将已创建的索引直接修改为时间索引。只能删除,重新创建
TTL不能是复合索引,只能是单键索引
在固定的集合中,不能创建TTL索引

删除索引

db.colname.dropIndex('索引名')
db.colname.dropIndexes()

查看集合中的所有索引

db.colname.getIndexes()

查看集合中的索引的总大小

db.colname.totalIndexSize()

强制索引

db.colname.find({条件}).hint('索引名')

重建索引

db.colname.reIndex()

建立索引的注意事项、有点,缺点:

优点:相当于创建了一个目录,能够提高查找的效率
缺点:1.对于插入、删除、修改数据会变慢,因为在做插入、删除、修改数据的时候,索引也会随之变化,
这样会降低效率 2.创建索引会产生额外的数据,增加我们对硬件的要求,会额外占用内存。
注意事项:
1.尽量减少创建不必要的索引
2.经常变动的键不必要创建索引
3.不会成为查询条件的值不需要创建索引
4.mongodb集合中最大的索引个数不能超过64个,
索引的名称不能超过128个字符,符合索引最大只能有31个字段
5. 不能命中索引的情况:innin 范围运算符,以及比较运算符。。。。。
6. mongodb中索引存放在内存中,必须确保索引的大小不会超过内存,
如果超过内存最大限制,mongodb会自动删除一些索引
创建用户:

普通用户、超级管理员

1.#创建超级管理员:
root:
read:
readWrite
use admin
db.createUser({
'user':'username',
'pwd':'password',
'roles':[{'role':'root',db:'admin'}]
})
2.#打开mongodb的安全设置
sudo vim /etc/mongod.conf

高版本

security:

authorization: enabled

2.1sudo vim /etc/mongodb.conf

低版本

auth=True

3.修改完毕之后重置:sudo service mongod|mongodb restart
4.使用超管登录
mongo -u 用户名 -p 密码 --authenticationDatabase 'admin'
创建一个普通用户
use dbname
db.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.system.users.remove({user:'username'})

查看所有的用户

use admin
db.system.users.find()

mongodb数据备份

mongodump -h 127.0.0.1:27017(本地可以省略) -d dbname -o 备份文件的路径

mongodb备份数据库下的集合

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/名称.json --type json
导出csv数据
mongoexport -d dbname -c colname -o ~/桌面/dump/名称.csv --type csv -f '键名,键名...'

导入数据

导入json数据
mongoimport -d dbname -c colname --file ~/桌面/dump/名称.json --type json
导入csv数据
mongoimport -d dbname -c colname --file ~/桌面/dump/名称.csv --type csv -filed '键名,..' ????
mongoimport -d dbname -c colname --file ~/桌面/dump/名称.csv --headerline --type csv

mongodb状态检测

mongostat
mongotop

副本集

目的:

1.防止数据灾难
2.实时备份,实现主从节点数据一致性
3.读写分离
4.无宕机行为
5.分担主节点的压力
缺点:具有中心化,所有的增删改操作都需要在主节点完成,
对主节点的压力较大,对主机的性能要求较高。

如何实现副本集?

开启mongod服务(至少两个)

mongod --bind_ip ip --port port --dbpath 数据存放的路径 --replSet rs0
....

连接mongo服务

mongo --host ip --port port

确定主节点

rs.initiate()

添加从节点

rs.add('ip:port')

激活从节点

rs.slaveOk()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容