• MongoDB-管道与聚合(3)


    分组:$group()

       db.集合.aggregate(
          {$group: {_id:'$分组字段名', 显示字段:{$统计函数: '$统计字段'}}},
        )
    -- 统计男生,女生各是多少
    db.stu.aggregate(
        {$group:{_id:'$gender', count:{$sum:1}}}
    )
    将整个文档为一组, 指定 id 为 null
    --求学生的总人数和平均年龄
    db.stu.aggregate(
        {$group:{_id:null, count:{$sum:1}, avg_scroe:{$avg:'$age'}}}
    )
     

    透视数据: $push统计函数

    $push: 把不同内容,放入一个数组(列表)
    使用: $$ROOT把这个文档内容加入到结果集中 
    -- 统计不同性别的学生姓名
    db.stu.aggregate(
        {$group:{_id:'$gender', name:{$push:'$name'}}}
    )

    过滤:$match

    用于过滤数据,只输出符合条件的才作为输出
    与find的区别:$match可以把过滤后的文档,交给下一个管道,而find()不可以
    过滤字段字段作为键, 直接写, 不能使用 '$字段名'的形式
      db.集合.aggregate(
          {$match:{json格式过滤条件}},
      )
    -- 查询年龄大于20的学生
      db.stu.aggregate(
        {$match:{age:{$gt:20}}}
      )
    --查询年龄大于20的男生与女生人数
      db.stu.aggregate(
        {$match:{age:{$gt:20}}},
        {$group:{_id:'$gender',counter:{$sum:1}}}
      )

     

    修改文档结构: $project

    修改输入文档结构, 添加字段,删除字段,重命名字段
      db.stu.aggregate(
        {$project:{_id:0, 字段名:1, 字段名: 1, 字段名: '$上一个结果集字段'}}
      )

    --查询 只显示学生的姓名,年龄
    db.stu.aggregate({$project:{_id:0, name:1, age:1}})
    --查询男生,女生人数, 只输出性别和人数
    db.stu.aggregate(
        {$group:{_id:'$gender', count:{$sum:1}}},
        {$project:{_id:0,gender:'$_id', count:1}}
    )

     

    排序$sort()

    将输入的文档排序后输出
    1为升序, -1为降序
    db.stu.aggregate(
      {$sort:{字段:1}}
    )
    --查询学生信息, 按年龄升序排列
    db.stu.aggregate(
        {$sort:{age:1}}
    )
    -- 查询男生和女生人数, 按人数降序排
    db.stu.aggregate(
        {$group:{_id:'$gender', count:{$sum:1}}},
        {$project:{_id:0,gender:'$_id', count:1}},
        {$sort:{count:-1}}
    )

    $skip&$limit

    $skip: 跳过指定数量的的文档,并返回剩余文档
    $limit: 限制聚合管道返回的文档数量
    --查询从第3条开始的学生信息
    --$limit: 限制聚合管道返回的文档数量
    db.stu.aggregate({$skip:2})
    ​
    --查询2条学生信息
    db.stu.aggregate({$limit:2})
    ​
    --统计男生,女生人数, 按人数升序, 取出第二条数据
    db.stu.aggregate(
        {$group:{_id:'$gender', count:{$sum:1}}},
        {$sort:{count:1}},
        {$skip:1},
        {$limit:1}
    )

     

    $unwind

    将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
    db.集合名称.aggregate({$unwind:'$字段名称'})
    db.t3.insert({_id:1,item:'t-shirt',size:['S','M','L']})
    --$unwind 将集合拆分
    db.t3.aggregate({$unwind:'$size'})
    结果:
     
    { "_id" : 1, "item" : "t-shirt", "size" : "S" }
    { "_id" : 1, "item" : "t-shirt", "size" : "M" }
    { "_id" : 1, "item" : "t-shirt", "size" : "L" }
    问题: 在使用$unwind的时候, 默认会丢弃属性值为空的文档.
    如果希望保留,需要把设置 preserveNullAndEmptyArrays 为true
      db.集合名.aggregate([
        {$unwind:{
           path:'$字段名称'
           preserveNullAndEmptyArrays:true(保留)/false(丢弃)
        }
      ])
     
  • 相关阅读:
    JVM垃圾回收机制
    浅谈类的几个基础构造函数
    三次登陆用户名 和密码
    干迷宫
    记录人生中的第一个bug
    js三元运算符? :
    Linux云服务器 磁盘分区失败
    python基础中遇到的问题(TypeError: unhashable type: 'list')
    python亲密数设计
    源码编译安装Protobuf
  • 原文地址:https://www.cnblogs.com/kadycui/p/10066950.html
Copyright © 2020-2023  润新知