• MongoDB之 分组查询


    分组查询

    可视化工具

    https://robomongo.org

    pymongo

    from pymongo import MongoClient
    # 方式一:
    c = MongoClient(host="127.0.0.1",port=27017)
    db=c["admin"]
    db.authenticate("root":"123")
    db = c['day5']
    print(db.collection_name(include_system_collections=False))
    # 方式二:
    c = MongoClient("mongodb://root:123@127.0.0.1:27017")
    db=c['day5']
    print(db.collection_name(include_system_collections=False))
    user_table=db['user']
    print(list(user_table.find()))
    
    

    分组查询

    # 聚合函数: $sum,$max,$min,$first,$last
    # 每个部门最高工资
    select post,max(salary) from emp group by post
    
    db.emp.aggregate({
        "$group":{
            "_id":"$post",
            "max_salary":{"$max":"$salary"},
            "avg_salary":{"$avg":"$salary"},
            "第一个":{"$first":"$name"}
        }
    })
    
    # 每个部门的员工姓名-- 拼到列表(相当于group_concat)
    db.emp.aggregate({
        "$goup":{
            "_id":"$post",
            "人员名单":{"$push":"$name"}
            #"人员名单":{"$addToset":"$name"} -- 去除重复
        }
    })
    

    $match : 对数据进行过滤

    # mysql where and having(只能是分组后使用),goup by 后面不能出现where
    # {"$match":{"字段":"条件"}}, 可以使用任何常用查询操作符 $gt, $lt,$in
    db.emp.aggregrate({
        "$match":{"name":"egon"}
    })
    db.emp.aggregrate({
        "$match":{"_id":{"$gt":3}}
    })
    # 查询部门最高工作 》10000 的部门信息
    db.emp.aggregrate(
        { "$group":{
            "_id":"$post",
            "max_salary":{"$max":"$salary"}
        }},
    	{"$match":{"max_salary":{"$gt":10000}}},
        {"$match":{"_id":{"$ne":"teacher"}}}   
    )
    
    

    投射 project

    # 不修改原始数据,只是显示
    # 1. {"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表达式"}}
    
    db.emp.aggregate(
    {"$project":{"name":1,"_id":0}}  -- 展示name, 不展示id
    )
    # 计算一年的工资
    db.emp.aggregate(
    {"$project":{
        "name":1,
        "_id":0,
    	"year_salary":{"$multiply":[12,"$salary"]}
    }}  -- 展示name, 不展示id
    )
    # 加法: 年龄+10 (可多个值)
    db.emp.aggregate(
    {"$project":{
        "name":1,
        "_id":0,
    	"10_later":{"$add":[10,"$age"]}
    }} 
    )
    ##2. 数学表达式
    {"add":[expr1,expr2,....]}  # 相加
    {"$subtract":[expr1,expr2]  # 相减
    {"$multiply":[expr1,expr2,...,exprN]} #相乘
    {"$divide":[expr1,expr2]} #第一个表达式除以第二个表达式的商作为结果
    {"$mod":[expr1,expr2]} #第一个表达式除以第二个表达式得到的余数作为结果
    
    #注意!! 隐藏字段不能参加运算
    
     # 3. 表达式之日期表达
     # $add   $subtract  $multiply   $divide
     $year $month, $week,$dayofMonth,$dayofWeek,$dayofYear,$hour,$minute,$second
     db.emp.aggregate(
    {"$project":{
        "name":1,
        "_id":0,
    	"year":{"$year":"$hire_date"}
        "job_year":{"$subtract":[{"$year":new Date()},{"$year":"$hire_date"}]}
    }} 
    )
     
    #4. 字符串表达式
    {"$substr":[字符串/$值为字符串的字段名,起始位置,截取几个'字节']}
    {"$concat":[expr1,expr2...]} #指定的表达式或字符串连接在一起返回,只支持字符串拼接
    {"$toLower":expr}
    {"$toUpper":expr}
    db.emp.aggregate({"$project":{"NAME":{"$toUpper":"$name"}}})
     
    # 5. 逻辑表达式
    $and
    $or
    $not
    其他见Mongodb权威指南
    

    $ group

    $group 用于分组
    # 分组后具体信息被隐藏
    db.emp.aggregate(
        {"$match":{"_id":{"$gt":3}}},
        {"$group":{"_id":"$post"}}
    )  # 结果:{"_id":"operation"} {"_id":"sale"} {"_id":"teacher"}  三个部门
    
    # 要对分组后的内容进行统计就需要对应的几个聚合函数
    # 对应的聚合函数 $sum、$avg、$max、$min、$first、$last
    # select id,avg(salary) from db1.emp where id > 3 group by post;  
    db.emp.aggregate(
        {"$match":{"_id":{"$gt":3}}},
        {"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}},
    )
    # match用于匹配 与mysql不同的是没有顺序限制,每一个操作接收上一个数据进行处理再传给下一个
    # select id,avg(salary) from db1.emp where id > 3 group by post having avg(salary) > 10000;
    db.emp.aggregate(
        {"$match":{"_id":{"$gt":3}}},
        {"$group":{"_id":"$post","ave_salary":{"$avg":"$salary"}}},
        {"$match":{"avg_salary":{"$gt":10000}}}
    )
    
    #1、将分组字段传给$group函数的_id字段即可
    {"$group":{"_id":"$sex"}} #按照性别分组
    {"$group":{"_id":{"state":"$state","city":"$city"}}} #按照多个字段分组,比如按照州市分组
    
    #2、分组后聚合得结果,类似于sql中聚合函数的聚合操作符:$sum、$avg、$max、$min、$first、$last
    #例1:select post,max(salary) from db1.emp group by post; 
    db.emp.aggregate({"$group":{"_id":"$post","max_salary":{"$max":"$salary"}}})
    
    #例2:去每个部门最大薪资与最低薪资
    db.emp.aggregate({"$group":{"_id":"$post","max_salary":{"$max":"$salary"},"min_salary":{"$min":"$salary"}}})
    
    #例3:如果字段是排序后的,那么$first,$last会很有用,比用$max和$min效率高
    db.emp.aggregate({"$group":{"_id":"$post","first_id":{"$first":"$_id"}}})
    
    #例4:求每个部门的总工资
    db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":"$salary"}}})
    
    #例5:求每个部门的人数
    db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":1}}})
    
    # 3. 数组操作符, 等同于group_concat
    "数组":{"$addToSet":expr}: 不重复
    "数组":{"$push":expr}:  重复      
     #例:查询岗位名以及各岗位内的员工姓名:select post,group_concat(name) from db1.emp group by post;
    db.emp.aggregrate({"$group":{"_id":"$post","names":{"$push":"$name"}}})
    db.emp.aggregrate({"$group":{"_id":"$post","names":{"$addToSet":"$name"}}})        
    

    $sort, limit, skip

    {"$sort":{"字段1":1,"字段2":-1}}  1升序  -1降序
    {"$limit":1}
    {"$skip":2} #跳过多少个文档
    #例1、取平均工资最高的前两个部门
    # 分类,平均工资,前两个
    db.emp.aggregrate(
        {"$group":{"ave_salary":{"$avg":"$salary"}}},
        {"$sort":{"ave_salary":1}},
        {"$limit":2}
        {"skip":1}
    )
    排序:$sort、限制:$limit、跳过:$skip
    
    

    $sample

    # 随机取出n条记录
    #集合users包含的文档如下
    { "_id" : 1, "name" : "dave123", "q1" : true, "q2" : true }
    { "_id" : 2, "name" : "dave2", "q1" : false, "q2" : false  }
    { "_id" : 3, "name" : "ahn", "q1" : true, "q2" : true  }
    { "_id" : 4, "name" : "li", "q1" : true, "q2" : false  }
    { "_id" : 5, "name" : "annT", "q1" : false, "q2" : true  }
    { "_id" : 6, "name" : "li", "q1" : true, "q2" : true  }
    
    db.users.aggregrate({"$sample":{"size":3}})
    
    
  • 相关阅读:
    【网络安全设备系列】2、IDS(入侵检测系统)
    【网络安全设备系列】4、漏洞扫描设备
    【网络安全设备系列】3、IPS(入侵防御系统)
    【网络安全设备系列】1、防火墙
    [操作系统作业]os
    [web知识]网页当中使用base64表示png图片
    [struts]异常Caught Exception while registering Interceptor class org.crazyit.auction.action.interceptor.AuthorityInterceptor interceptor
    [struts]使用struts验证框架验证表单输入如何配置Action
    [操作系统作业]os实验三:进程的管道通信
    [spring]异常 Illegal UTF8 string in constant pool in class file com/mchange/lang/PotentiallySecondaryException
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10719218.html
Copyright © 2020-2023  润新知