mongodb find aggregate管道 常用查询

find查询(此例基本包含了mongodb find查询所有的常用操作):

db.test.find(
    {
        // 范围 $gte $lte
        hours: {$gte: "2019-01-01 00", $lt: "2019-01-01 01"}, 
        // 多条件查询 并 $and
        $and: [
            {
                // 模糊查询
                code: /^.*02/i
            }, 
            {
                // 多条件查询 或 $or
                $or: [
                    {
                        // 不包含此条件 $not,使用正则表达式 $regex
                        code: {$not: {$regex: "air_.*"}}
                    }, 
                    {
                        // 多值查询 $in
                        code: {$in: ["1718", "1719", "1720"]}
                    }
                ]
            }
        ], 
        // 如果同一字段未使用 $and $or 的情况下多条件查询,后一个条件会顶替掉前一个条件
        code: "air_130", 
        //不等于 $ne
        code: {$ne: "air_130"}
    }, 
    // 规定输出字段(find无法起别名,需用管道 aggregate)
    {
        code: 1, 
        hours: 1
    }
    // 在mongo中多条件的最后,多一个逗号不会报错
    ,
)
// 排序 sort(-1为倒序)
.sort(
    {
        hours: -1,
        code: -1
    }
)
// 查询条数 limit,跳过条数 skip,结果为倒数第三至十二条数据
.limit(10).skip(2)
// 计数(先limit再计数会冲突)
.count()

aggregate管道查询(此例基本包含了mongodb管道查询所有的常用操作):

db.test.aggregate([
    {
        // 查询条件
        $match: {
            // 条件1
            $or: [
                {hours: {$gte: "2019-09-01 00", $lte: "2019-09-01 00"}},
                {hours: {$gte: "2019-09-03 00", $lte: "2019-09-03 02"}}
            ],
            // 条件2
            code: {$regex: ".*air_15.*"}
        }
    },
    {
        // 分组
        $group: {
            // 多字段分组,_id后是分组字段,分组字段可写为null来将所有结果聚合到一起
            _id: {hours: "$hours", time: "$time"},
            
            // 取第一个值
            first_V_17: {$first: "$V_17"},
            // 取最后一个值,作用于多个字段
            last_data: {$last: {V_14: "$V_14",V_12: "$V_12"}},
            
            // 取最大的一个值
            max_V_16: {$max: "$V_16"},
            // 取最小的一个值
            min_V_12: {$min: "$V_12"},
            
            // 取所有值组成数组,允许重复
            any_V_18: {$push: "$V_18"},
            // 取所有值组成数组,去除重复值
            alone_V_18: {$addToSet: "$V_18"},
            
            // 取平均值
            avg_V_11: {$avg: "$V_11"},
            // 求和
            sum_V_11: {$sum: "$V_11"},
            // 计数
            number: {$sum: 1},
        }
    },
    {
        // 查询条件,对前面的查询结果再次过滤
        $match: {
            number: 7
        }
    },
    {
        // 排序
        $sort: {
            // 使用内嵌文档特定键值排序,需加引号
            "_id.hours": 1
        }
    },
    {
        // 规定输出字段
        $project: {
            // 别名
            hours: "$_id.hours",
            time: "$_id.time",
            
            // 无别名
            first_V_17: 1,
            last_data: 1,
            max_V_16: 1,
            min_V_12: 1,
            
            any_V_18: 1,
            alone_V_18: 1,
            
            avg_V_11: 1,
            sum_V_11: 1,
            number: 1,
        }
    },
    {
        // 指定为0,即去除指定输出字段,不可与规定输出字段同一对象内使用
        $project: {
            _id: 0,
            time: 0
        }
    },
    {
        // 查询条数
        $limit: 4
    },
    {
        // 跳过条数,管道中limit和skip的先后顺序会影响最后的输出条数,当前结果为3条
        $skip: 1
    },
    {
        // 计数
        $count: "count"
    }
])

你可能感兴趣的:(mongodb find aggregate管道 常用查询)