zoukankan      html  css  js  c++  java
  • 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}
        ]
    )

    你的无畏来源于你的无知!

  • 相关阅读:
    索引法则--少用OR,它在连接时会索引失效
    索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)
    索引法则--字符串不加单引号会导致索引失效
    索引法则--IS NULL, IS NOT NULL 也无法使用索引
    tomcat管理模块报401 Unauthorized
    MySQL报Too many connections
    JDBC连接MySql例子
    linux安装jdk并设置环境变量(看这一篇文章即可)
    深度解析Java可变参数类型以及与数组的区别
    MySQL真正的UTF-8字符集utf8mb4
  • 原文地址:https://www.cnblogs.com/YiwenGG/p/13916429.html
Copyright © 2011-2022 走看看