MongoDB小总结

关系型数据库:mysql
非关系型数据库:mongodb、redis
mongodb:(nosql:not only sql)
它是一个非关系型数据库(文档性(mongodb)、图像存储型、键值存储(redis)...)

mongodb存储的文档那个类型如下

{'name':'lisi'}
{'name':'xinc','age':20}
{'name':'xinc','age':20,'bhsc':'bckssc'}

数据库的配置文件
/etc/mongod.conf

mongodb启动服务相关命令

sudo service mongod|mongodb start
sudo service mongod|mongodb stop
sudo service mongod|mongodb restart

启动客户端

mongo

查看当前数据库

db

查看所有数据库据

show dbs

切换数据库(创建数据库)

use dbname

查看数据库的状态信息

db.stats()

查看数据库下面的所有集合

show collections

删除数据库(你当前在那个数据库下,删除的就是那个数据库)

db.dropDatabase()

创建非固定大小的集合

db.createCollection('dbname')

创建固定大小的集合

db.createCollection('dbname',{'capped':true,'size':1000,'max':10})

capped:默认是false不固定大小,capped设置为true表示创建固定大小的集合,
size:集合允许存储的最大字节数
max:集合允许存储的最大文档数
size的优先级高于max:

插入数据

db.colname.insert({key:'value',....})
db.colname.insert([{key:'values'},{key:'values',....}])

db.colname.insertOne({key:'values'})
db.colname.insertMany([{key:'values'}....])

update更新数据

指定域更新
db.colname.update({条件},{$set:{age:20}})

全文档更新
db.colname.update({条件},{age:20})

multi:true表是更改所有查到(满足条件)的数据(multi默认是false,只跟新一条)

db.colname.update({条件},{$set:{age:20}},{multi:true})

upsert:true表示找不到数据,插入一条数据,upsert:默认是false

db.students.update({name:'李三'},{name:'李四'},{upsert:true})

save更新数据

假如_id这个文档已经存在,那么全文档覆盖,反之,新插入一条数据

db.colname.save({_id:'value',name:'',age:''})

不使用_id,相当于insert插入数据,效率低

db.colname.save({name:'',age:''})

remove(删除数据)

删除所有

db.colname.remove({条件})

删除一条

db.colname.remove({条件},{justOne:true})
db.colname.remove({条件},1)

find查找数据

db.collectionname.find({条件})
db.collectionname.find()

运算符

比较运算符
等于
db.colname.find({name:'',age:''})

lt 小于 db.colname.find({age:{lt:20}})

lte 小于等于 db.colname.find({age:{lte:20}})

gt 大于 db.colname.find({age:{gt:20}})

gte 大于等于 db.colname.find({age:{gte:20}})

ne 不等于 db.colname.find({age:{ne:20}})

逻辑运算符
or 或者 db.colname.find({or:[name='张三',{age:{$gt:23}}]})

范围运算符
in (范围查询)相当于或者的意思 db.colname.find({age:{in:[25,28,30]}})

nin (不在某个范围) db.colname.find({age:{nin:[25,28,30]}})

正则的使用

/正则表达式/

{key:{$regex:'正则表达式'}}

db.colname.find({key:/正.../})
db.colname.find({key:{$regex:'正则表达式'}})

自定义函数查询

db.集合名称.find({where:function(){函数}}) 例子:返回性别为男的同学信息 db.集合名称.find({where:function(){return this.gender=='男'}}})

$type

db.集合名称.find('key',{$type:'数据类型'})

limit:限制查询

db.集合名称.find({条件}).limit(数字)

skip:跳过,从第几条开始返回

db.集合名称.find({条件}).skip(数字)

limit与skip集合使用,没有先后顺序

db.集合名称.find({条件}).skip(数字).limit(数字)

sort:排序

db.集合名称.find({条件}).sort({'key':1}) #升序
db.集合名称.find({条件}).sort({'key':-1}) #降序

distinct:去重

db.集合名称.distinct('key',{条件})

project投影(返回文档中指定的键)

1:表示显示, 0:表示不显示
db.集合名称.find({条件},{'key':1,'key':1,....})
db.集合名称.find({条件},{'key':0,'key':0,....})

count:计数

db.集合名称.find({条件}).count()
db.集合名称.count({条件})

聚合操作

$group:将集合中的文档分组,可用于统计结果。

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。

$limit:用来限制MongoDB聚合管道返回的文档数。

$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

$sort:将输入文档排序后输出。

根据作者分作,统计每个分组的下文档数量

db.books.aggregate([{group:{_id:'by_user',count:{$sum:1}}}])

_id为空的时候,将所有的文档分为一组

db.books.aggregate([{group:{_id:'null',count:{sum:1}}}])

统计每个分组下的,文档的likes字段的总和

db.books.aggregate([{group:{_id:'by_user',likes:{sum/max/min/avg:'likes'}}}])

first 返回分组文档里面的第一个文档中的某个字段

db.books.aggregate([{group:{_id:'by_user',url:{first:'url'}}}])

last 返回分组文档里面的最后一个文档中的某个字段

db.books.aggregate([{group:{_id:'by_user',url:{last:'url'}}}])

push 可以将分组文档中的某个字段,以数组的形式返回

db.books.aggregate([{group:{_id:'by_user',push:{push:'url'},...}}])
db.books.aggregate([{group:{_id:'by_user',push:{$push:'$$ROOT'}}}])

project:

db.colname.aggregate([{project:{'字段':1}}]) db.colname.aggregate([{project:{'字段':0}}])

分组和投影共同使用

db.books.aggregate([{group:{_id:'by_user',count:{sum:1}}},{project:{count:0,_id:0}}])

limit 限定返回

db.books.aggregate([{$limit:2}])

skip 跳过

db.books.aggregate([{$skip:2}])

组合使用(有先后顺序会印象结果)

db.books.aggregate([{skip:2},{limit:2}])

match 过滤

db.books.aggregate([{match:{likes:{gt:20,lt:50}}}]) db.books.aggregate([{match:{likes:{gt:20,lt:50}}},{skip:2},{limit:2}])

unwind 将文档中的数组拆分成单条数据

db.books.aggregate([{unwind:'tags'}])

创建用户(权限)

read 可读

readWrite 可读可写

root 超级管理员

创建一个超级管理员

use admin
db.createUser(
{
user:'username',
pwd:'mima',
roles:[{role:'root',db:'admin'}]
}
)

1.修改/etc/mongod.conf 文件
2.打开其中的安全配置

security:

authorization: enabled

3.退出保存,停止mongodb服务,然后重置服务

使用账号密码登录

mongo -u 'ljh' -p '123' --authenticationDatabase 'admin'

查看所有用户

use admin
db.system.users.find()

创建一个普通用户(必须是超级管理才能够创建)

use 数据库名
db.createUser(
{
user:'用户名',
pwd:'密码',
roles:[{role:'readWrite',db:'数据库名'}]
 }
)
mongo -u '用户名' -p '密码' --authenticationDatabase '数据库名'

修改密码:

use 数据库名称
db.updateUser('用户名',{pwd:'新密码'})

删除用户权限

use class1804
db.revokeRolesFromUser('用户名',[{role:'',db:''}])

添加权限

use class1804
switched to db class1804
db.grantRolesToUser('用户名',[{role:'readWrite',db:'数据库名'}])

删除用户(在当前用户所有权限的数据库下删除):

use 数据库名称
db.dropUser('用户名')

删除用户(在admin数据库下删除):

use admin
db.system.users.remove({user:'用户名'})

数据库的备份

mongodump -h 127.0.0.1:27017 -d 数据库名称 -o 数据备份路径

有认证权限的时候

mongodump -u 'username' -p 'mima' --authenticationDatabase 'admin'' -d 数据库名称 -o 数据备份路径

恢复:

mongorestore -h 127.0.0.1:27017 -d class1804 --dir ~/桌面/dump/class1804

备份所有数据库:

mongodump -h ip:port -o 备份文件路径

恢复(还原)所有数据库

mongorestore -h ip:port --dir 已经备份的文件路径

mongodbexport 导出json文件

注意:

dbname:表示数据库名
colname:表示集合名称

mongoexport -d dbname -c colname -o path(路径)/文件名.json --type json

mongodbimport 导入json文件

mongoimport -d dbname -c colname --file path(路径)/文件名.json --type json

mongodbexport 导出csv文件

mongoexport -d dbname -c colname -o path(路径)/文件名.csv --type csv -f '键的名称,键的名称,键的名称'

mongodbimport 导入csv文件

mongoimport -d dbname -c colname --file path(路径)/文件名.csv --headerline --type csv

主从副本集

(实时备份、防止数据灾难、读写分离、无宕机行为)

怎么实现主从?

必须要保证一注一从
开启服务。服务处于等待状态
mongod --bind_ip (ip) --port (port) --dbpath (数据备份的路径) --replSet (副本集标示)rs0

连接服务?
mongo --host (ip) --port (port)

确定主节点(主窗口)
rs.initiate() (初始化主节点)

添加从节点
rs.add('ip:port')

查看节点信息
rs.status()

激活从节点
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

推荐阅读更多精彩内容

  • 安装 mongodb服务: sudo service mongod/mongodb start sudo serv...
    末版车阅读 581评论 0 0
  • 一、MongoDB介绍 1、NoSQL:非关系型数据库 在php的世界里,常见的非关系型数据库有memcached...
    宠辱不惊丶岁月静好阅读 628评论 0 3
  • 什么是Mongodb数据库? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统 Mo...
    瘦不下去了阅读 666评论 0 0
  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 974评论 0 2
  • 1. MongoDB 简介 MongoDB是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于分布式文...
    rhlp阅读 1,100评论 0 3