美文网首页
MongoDB小总结

MongoDB小总结

作者: BaiBao丶 | 来源:发表于2019-02-13 22:18 被阅读0次

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

    相关文章

      网友评论

          本文标题:MongoDB小总结

          本文链接:https://www.haomeiwen.com/subject/vzpjeqtx.html