MongoDB杂谈(二)

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

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,928评论 2 89
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,156评论 0 33
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,811评论 5 116
  • 他们撑着伞站在街边,静静观望着六月的雪花渐渐沉进眼前的地面消失不见。 我走过他们时,他们正紧紧相拥着,我想他们应该...
    再见图安阅读 102评论 0 0