Mongodb高级操作

练习数据

 db.students.insert(
     [
         {'_id':0, 'name': '小林', 'gender': '男', 'age': 20},
         {'_id':1, 'name': '小黑', 'gender': '男', 'age': 20},
         {'_id':2, 'name': '小白', 'gender': '男', 'age': 22},
         {'_id':3, 'name': '小小林', 'gender': '女', 'age': 21},
         {'_id':4, 'name': '小徐', 'gender': '女', 'age': 19},
         {'_id':5, 'name': '小吴', 'gender': '女', 'age': 20},
         {'_id':6, 'name': '小红', 'gender': '女', 'age': 30},
         {'_id':7, 'name': '小明', 'gender': '男', 'age': 20},
         {'_id':8, 'name': '小林', 'gender': '男', 'age': 19},
         {'_id':9, 'name': '小林', 'gender': '男', 'age': 20},
         {'_id':10, 'name': '张小红', 'gender': '女', 'age': 19},
     ]
 )

插入数据

 

 

 

聚合 aggregate

聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()

语法

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

管道

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入

在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理

常用管道

  • $group:将集合中的文档分组,可用于统计结果
  • $match:过滤数据,只输出符合条件的文档
  • $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
  • $sort:将输入文档排序后输出
  • $limit:限制聚合管道返回的文档数
  • $skip:跳过指定数量的文档,并返回余下的文档
  • $unwind:将数组类型的字段进行拆分

表达式

处理输入文档并输出

常用表达式

  • $sum:计算总和,$sum:1同count表示计数
  • $avg:计算平均值
  • $min:获取最小值
  • $max:获取最大值
  • $push:在结果文档中插入值到一个数组中
  • $first:根据资源文档的排序获取第一个文档数据
  • $last:根据资源文档的排序获取最后一个文档数据

$group

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

_id表示分组的依据,使用某字段的格式为 $字段

举例:统计男生和女生的总人数

db.students.aggregate(
    [
        {$group:
            {
                _id: "$gender",
                counter: {$sum: 1}
            }
        }
    ]
)

 将集合中所有文档分为一组,求学生总人数和平均年龄

 

db.students.aggregate(
    [
        {$group:
            {
                _id: null,
                counter: {$sum: 1},
                avgAge: {$avg: '$age'}
            }
        }
    ]
)

 

 

 统计学生性别和姓名

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                name: {$push: '$name'}
            }
        }
    ]
)

 

 

 

 使用$$ROOT可以将文档加入到结果集的数组中

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                name: {$push: '$$ROOT'}
            }
        }
    ]
).pretty()

 

 

 

 

 

 $match

用于过滤数据,只输出符合条件的文档

举例:查询年龄大于20的学生

db.students.aggregate(
    [
        {$match:
            {age:{$gt: 20}}
        }
    ]
)

 

 

 

 

 

 查询年龄大于20的男生女生人数

db.students.aggregate(
    [
        {$match:
            {age:{$gt: 20}},
        },
        {$group:
            {
                _id: '$gender',
                counter: {$sum: 1}
            }
        }
    ]
)

 

 

$project

修改输入文档的结构

举例:查询学生的姓名和年龄

db.students.aggregate(
    [
        {$project:
            {
                _id: 0,
                name: 1,
                age: 1
            }
        }
    ]
)

 

 

 查询男生女生人数,并输出人数

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                counter: {$sum: 1}
            }
        },
        {$project:
            {
                _id: 1,
                counter: 1
            }
        }
    ]
)

 

 

 $sort

将输入文档排序后输出

举例:查询学生信息,按年龄升序

db.students.aggregate(
    [
        {$sort:
            {age: 1}
        }
    ]
)

 

 查询男生女生人数,按人数降序

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                counter: {$sum: 1}
            }
        },
        {$sort:
            {
                counter: -1
            }
        }
    ]
)

 

 $limit

限制聚合管道返回的文档数

举例:查询两条学生信息

db.students.aggregate(
    [
        {$limit: 2}
    ]
)

 

 $skip

跳过指定数量的文档,并返回余下文档

举例:查询从第三条开始的学生信息

db.students.aggregate(
    [
        {$skip: 2}
    ]
)

 

posted @ 2020-11-02 20:51  一文g  阅读(251)  评论(0编辑  收藏  举报