mongodb总结

安装

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

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

推荐阅读更多精彩内容