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

lte:20}})

gt:20}})

gte:20}})

ne:20}})

逻辑运算符
or:[name='张三',{age:{$gt:23}}]})

范围运算符
in:[25,28,30]}})

nin:[25,28,30]}})

正则的使用

/正则表达式/

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

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

自定义函数查询

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使用MongoDB的标准查询操作。

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

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

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

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

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

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

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

db.books.aggregate([{sum:1}}}])

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

db.books.aggregate([{by_user',likes:{likes'}}}])

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

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

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

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

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

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

project:

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

分组和投影共同使用

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

limit 限定返回

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

skip 跳过

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

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

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

match 过滤

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

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

db.books.aggregate([{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()

你可能感兴趣的:(MongoDB小总结)