• mongodb


    一、基本命令

      1.使用终端连接:mongo

      2.查看当前数据库名称:db

      3.查看当前数据库信息:db.status()

      4.终端退出连接:exit或ctrl + c

      5.列出所有在物理上存在的数据库:show dbs

      6.切换数据库,如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建:use 数据库名称

      7.删除数据库:db.dropDatabase()

    二、集合操作

      1.集合创建:db.createCollection(name, options)

        默认capped为false即不限制大小,当capped为true时,size为上限大小,文档达到上限时,会将之前的数据覆盖,单位为字节

        限制集合大小:db.createCollection("stu", {capped:true, size:10})

      2.查看当前数据库的结合:

        show collections

      3.删除集合

        db.集合名称.drop()

      4.插入

        db.集合名称.insert(document)

      5.简单查询

        db.集合名称.find()

      6.更新

        db.集合名称.update(

          <query>,    查询条件:类似sql语句Update中的where部分  {name:'def'}

          <update>,    更新操作符:类似sql语句update中的set部分,只更新一个字段时使用$set  {$set{name:'abc'}}

          {multi:<boolean>}  可选,默认为false,表示只更新找到的第一条记录,true时为全部更新

        )

      7.删除

        db.集合名称.remove(

          <query>,

          {

            justOne:<boolean>

          }

        )

        全部删除:db.集合名称.remove({})

    三、数据查询

      1.方法fiind():查询

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

      2.方法findOne():查询,只返回第一个

        db.集合名称.findOne({条件文档})

      3.方法pretty():将结果格式化

        db.集合名称.find({条件文档}).pretty()

      4.比较运算符

        小于:$lt

        小于或等于:$lte

        大于:$gt

        大于或等于:$gte

        不等于:$ne

        示例:db.user.find({age:{$gte:18}})

      5.逻辑运算符

        逻辑与

          示例:db.user.find({name:'张三', age:{$gte:18}})

        逻辑或:$or

          示例:db.user.find({$or:[{age:{$gte:18}}, {name:'张三'}]})

      6.范围运算符

        在某个范围内:$in

          示例:db.user.find({age:{$in:[18, 28]}})

        不在某个范围内:$nin

      7.正则表达式

        具体规则同js

          示例:db.user.find({name:/[a-zA-z]+/})

      8.自定义查询

        使用$where后面写一个函数,返回满足条件的数据,同js函数

          示例:db.user.find({$where:function(){return this.age>20}})

      9.limit:获取几条

        db.集合.find().limit(number)

      10.skip:跳过几条

        db.集合.find().skip(number)

      11.排序:sort

        db.集合.find().sort({字段:1, 字段2:-1})

          参数1为升序排列,参数-1为降序排列

      12.统计个数:count

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

      13.消除重复:distinct

        db.集合.distinct('去重字段', {条件})

    四、高级操作

      1.聚合

        db.集合.aggregate([管道:{表达式}])

          常用管道:

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

     1 db.user.aggregate([
     2     {$group:
     3          {
     4               _id:'$age',                   _id表示分组的依据
     5               counter:{$sum:1}              具体字段名前要加$
     6         }                                   使用$$ROOT可以得到整个文档
     7     }
     8 ])    

            $match:过滤数据,只输出符合条件的文档

    1 db.user.aggregate([
    2     {$match:{age:{$gt:20}}}
    3 ])
    4 
    5 查询年龄大于20的男生、女生人数
    6 db.user.aggregate([
    7     {$match:{age:{$gt:20}}},
    8     {$group:{_id:'$gender',counter:{$sum:1}}}
    9 ])

            $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

    查询学生的姓名、年龄
    db.stu.aggregate([
        {$project:{_id:0,name:1,age:1}}
    ])
    
    查询男生、女生人数,输出人数
    db.stu.aggregate([
        {$group:{_id:'$gender',counter:{$sum:1}}},
        {$project:{_id:0,counter:1}}
    ])

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

    查询学生信息,按年龄升序
    b.stu.aggregate([{$sort:{age:1}}])
    
    查询男生、女生人数,按人数降序
    db.stu.aggregate([
        {$group:{_id:'$gender',counter:{$sum:1}}},
        {$sort:{counter:-1}}
    ])

            $limit:限制聚合管道返回的文件数

            $skip:跳过制定数量的文档,并返回余下的文档

    统计男生、女生人数,按人数升序,取第二条数据
    db.stu.aggregate([
        {$group:{_id:'$gender',counter:{$sum:1}}},
        {$sort:{counter:1}},
        {$skip:1},
        {$limit:1}
    ])

            $unwind:将数组类型的字段进行拆分

    构造数据
    db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
    查询
    db.t2.aggregate([{$unwind:'$size'}])
    
    
    对某字段值进行拆分
    处理空数组、非数组、无字段、null情况
    db.t3.insert([
    { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
    { "_id" : 2, "item" : "b", "size" : [ ] },
    { "_id" : 3, "item" : "c", "size": "M" },
    { "_id" : 4, "item" : "d" },
    { "_id" : 5, "item" : "e", "size" : null }
    ])
    
    使用语法1查询
    db.t3.aggregate([{$unwind:'$size'}])
    查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
    问:如何能不丢弃呢?
    答:使用语法2查询
    db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}])

          表达式:

            $sum:计算总和,$sum:1同count表示计数

            $avg:计算平均值

            $min:获取最小值

            $max:获取最大值

            $push:在结果文档中插入值到一个数组中

            $first:根据资源文档的排序获取第一个文档的数据

            $last:根据资源文档的排序获取最后一个文档的数据

     五、索引

      1.建立普通索引:db.集合.ensureIndex({属性:1})    1表示升序索引 -1表示降序索引

      2.建立唯一索引:db.集合.ensureIndex({属性:1}, {'unique':true})

      3.联合索引:db.集合.ensureIndex({name:1, age:1})

      4.查看文档所有索引:db.集合.getIndexes()

      5.删除索引:db.集合.dropIndexes('索引名称')

    六、安全

      1.常用角色

        root:只在admin数据库中可用,超级账号,超级权限

        Read:只允许读取指定数据库

        readWrite:允许用户读写指定数据库

      2.创建超级管理员用户

    1 use admin
    2 db.createUser({
    3     user:'admin',
    4     pwd:'123',
    5     roles:[{role:'root', db:'admin'}]
    6 })

      3.安全性流程

    修改配置文件
    sudo vi /etc/mongod.conf
    启用身份验证
    注意:keys and values之间一定要加空格, 否则解析会报错
    security:
    authorization: enabled
    重启服务
    sudo service mongod stop
    sudo service mongod start
    终端连接
    mongo -u 'admin' -p '123' --authenticationDatabase 'admin'

    七、复制(主从服务器)

    1.分别在两台服务器上开启服务
    mongod --bind_ip 192.168.1.2 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0(此名字一定要一致)
    mongod --bind_ip 192.168.1.3 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
    2.客户端连接主服务器
    mongo --host 192.168.1.2 --port 27017
    3.初始化
    rs.initiate()
    4.添加副本集
    rs.add('192.168.1.3:27017')
    5.连接第二个mongo服务器
    mongo --host 192.168.1.3 --port 27017
    6.如果在从服务器上进行读操作,需要设置rs.slaveOk()
    rs.slaveOk()
    db.t1.find()
    7.删除从节点
    rs.remove('192.168.1.3:27018')
    • -h:服务器地址,也可以指定端口号
    • -d:需要备份的数据库名称
    • -o:备份的数据存放位置,此目录中存放着备份出来的数据
     

    八、备份

      1.语法:mongodump -h dbhost -d dbname -o dbdirectory

    • -h:服务器地址,也可以指定端口号
    • -d:需要备份的数据库名称
    • -o:备份的数据存放位置,此目录中存放着备份出来的数据

      2.恢复:mongorestore -h dbhost -d dbname --dir dbdirectory

    • -h:服务器地址
    • -d:需要恢复的数据库实例
    • --dir:备份数据所在位置

    九、python操作mongodb

    进入虚拟环境
    sudo pip install pymongo
    或源码安装
    python setup.py
    
    • 引入包pymongo
    import pymongo
    
    • 连接,创建客户端
    client=pymongo.MongoClient("localhost", 27017)
    
    • 获得数据库test1
    db=client.test1
    
    • 获得集合stu
    stu = db.stu
    
    • 添加文档
    s1={name:'gj',age:18}
    s1_id = stu.insert_one(s1).inserted_id
    
    • 查找一个文档
    s2=stu.find_one()
    
    • 查找多个文档1
    for cur in stu.find():
        print cur
    
    • 查找多个文档2
    cur=stu.find()
    cur.next()
    cur.next()
    cur.next()
    
    • 获取文档个数
    print stu.count()
  • 相关阅读:
    javac 命令行使用总结
    电脑右键菜单的编辑(注册表操作)
    C++ —— 类模板的分离式编译
    命令行学习备份
    浏览器老是自动跳出广告垃圾网页
    SQL 事务
    Python中MySQL插入数据
    Python给数字前固定位数加零
    selenium+python3 鼠标事件
    mysql与mongodb命令对比
  • 原文地址:https://www.cnblogs.com/peilanluo/p/9426964.html
Copyright © 2020-2023  润新知