美文网首页
MongoDB杂谈(二)

MongoDB杂谈(二)

作者: 梦醒家先生 | 来源:发表于2018-08-12 12:00 被阅读0次

聚合,帮助我们统计的操作,查询操作主要的目的是寻找数据,聚合的目的统计数据

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

$group 管道

$group 就是按照字段进行分组
指定分组的字段,字段名称

// 基本表达式
db.stu.aggregate([ 
    {
        '$group' : {
            // 指定分组字段,注意要引用数据字段必须添加 `$`
            '_id':"$gender",
            // 进行表达式操作
            // $sum 表示记数
            '人数计算':{$sum:1},
            // $avg 平均值表达式
            '年龄平均值':{$avg:"$age"},
            // $min
            '最小年龄':{$min:"$age"},
            // $max
            '最大年龄':{$max:"$age"}
        }
    }
])
// $push 表达式 
db.stu.aggregate([ 
    {
        '$group' : {
            // 指定分组字段,注意要引用数据字段必须添加 `$`
            '_id':"$gender",
            // 通过性别进行分组,分别计算出来自的地区
            // $push 会把分组内容某个字段放入到列表中
            // "家乡列表":{$push:"$hometown"}
            // $$ROOT 表示当前的记录本身
            "记录列表":{$push:"$$ROOT"}
        }
    }
]).pretty()

// $push 表达式 
db.stu.aggregate([ 
    {
        '$group' : {
            //  null 表示把所有记录作为一组数据
            '_id':null,
            "记录列表":{$push:"$hometown"}
        }
    }
])

match 管道,过滤数据, `match` 管道的查询条件和find的查询条件一致的

db.stu.aggregate([ 
    {
        '$match' : {
            // 填写过滤条件
            age:{$gt:20}
        }
    },
    {
        '$group':{
            "_id":"$gender",
            "平均年龄":{$avg:"$age"}
        }
    }
])

$project 管道,类似于投影

db.stu.aggregate([ 
    {
        '$match' : {
            // 填写过滤条件
            age:{$gt:20}
        }
    },
    {
        '$group':{
            "_id":"$gender",
            "平均年龄":{$avg:"$age"}
        }
    },
    {
        '$project':{
            "_id":0,
            "平均年龄":1
        }
    }
])

$sort

db.stu.aggregate([ 
    {
        '$match' : {
            // 填写过滤条件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年龄":{$avg:"$age"}
        }
    },
    {
        '$sort':{
            // 1:升序
            // -1:降序
            '平均年龄':1
        }
    }
])

limit 和skip,有先后顺序,谁先谁手按照数据流来看

db.stu.aggregate([ 
    {
        '$match' : {
            // 填写过滤条件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年龄":{$avg:"$age"}
        }
    },
    {
        '$limit':2
    }
])

db.stu.aggregate([ 
    {
        '$match' : {
            // 填写过滤条件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年龄":{$avg:"$age"}
        }
    },
    {
        '$skip':1
    }
])


db.stu.aggregate([ 
    {
        '$match' : {
            // 填写过滤条件
            age:{$gt:16}
        }
    },
    {
        '$group':{
            "_id":"$hometown",
            "平均年龄":{$avg:"$age"}
        }
    },
    {
        '$skip':1
    },
    {
        '$limit':2
    }
])

$unwind,通过列表数据拆分数据集

db.t2.aggregate([ 
    {
        '$unwind' : '$size'
    }
])

// 默认情况下 $unwind 拆分数据会过滤 空数据,空列表,不存在字段
db.t3.aggregate([ 
    {
        '$unwind' : {
            // 指定拆分字段
            path:"$size",
            // 是否显示 空数据,空列表,不存在字段的数据
            preserveNullAndEmptyArrays:true
        }
    }
])

索引,提高查询效率,缺点:插入,更新会降低速度

// 创建索引
db.t1.ensureIndex({
    "name":1
})

// 查看索引列表
db.t1.getIndexes()

// 删除索引
db.t1.dropIndex("name_1")

扩展

  1. 服务器端会创建备份脚本
# mysql 备份说明
mysqldump -uroot -p123456 数据名 | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz

# mongodb
mongodump -h dbhost -d dbname -o dbdirectory | gzip > /data/backup/bks/cslized_$(date +%Y%m%d_%H%M%S).sql.gz

  1. 通过 corntab 定时执行脚本实现备份
    注意: 不要手动 拷贝 复制

启动用户验证模式

启动方式

  1. --auth参数启动
  2. 通过配置文件添加 auth=true

验证模式

  1. 必须要有账号
// 如果当前mongodb中没有任何账号第一步先创建 root 账号
use admin
// 创建root账号,一旦创建成功之后,就无法再创建,
db.createUser({
    "user":"python",
    "pwd":"123456",
    roles:["root"]
})
  1. 先要进行登录
use admin
db.auth('python','123456')
  1. 创建普通账号
db.createUser({
    "user":"db_01",
    "pwd":"123456",
    roles:[
        {
            // 对哪个数据库
            "db":"db_01",
            // 权限 read,write,readWrite
            "role":"readWrite"
        }
    ]
})

db.createUser({
    "user":"db_02",
    "pwd":"123456",
    roles:[
        {
            // 对哪个数据库
            "db":"db_02",
            // 权限 read,write,readWrite
            "role":"readWrite"
        }
    ]
})

  1. 删除用户
use admin
db.dropUser('用户名')

与python交互

sudo pip install pymongo
  • 引入包pymongo
from pymongo import *

MongoClient对象

  • 使用init方法创建连接对象
client = MongoClient('主机ip',端口)

Database对象

  • 通过client对象获取获得数据库对象
db = client.数据库名称

Collections对象

  • 通过db对象获取集合对象
collections = db.集合名称

主要方法如下

  • insert_one:加入一条文档对象
  • insert_many:加入多条文档对象
  • find_one:查找一条文档对象
  • find:查找多条文档对象
  • update_one:更新一条文档对象
  • update_many:更新多条文档对象
  • delete_one:删除一条文档对象
  • delete_many:删除多条文档对象

Cursor对象

  • 当调用集合对象的find()方法时,会返回Cursor对象
  • 结合for...in...遍历cursor对象
image.png

相关文章

网友评论

      本文标题:MongoDB杂谈(二)

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