关系型数据库: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()
网友评论