• Mongo按指定字段 分段分组 聚合统计


    现在有一批数据如下(表名detectOriginalData):

    {
        "_id" : "760c29a2720ead1681184dfbef0aaae4",
        "imgSavePath" : "/opt/temp/face/publicceaf441cf933bba310e4.JPG",
        "faceDetail" : {
            "face_token" : "760c29a2720ead1681184dfbef0aaae4",
            "location" : {
                "left" : 110.04,
                "top" : 244.39,
                "width" : 311.0,
                "height" : 263.0,
                "rotation" : -2
            }
        },
        "cdt" : ISODate("2020-12-25T10:53:43.647+08:00")
    }

    现在,我们要统计faceDetail.location.width,找出width处于300-400之间,每隔10分一段(也就是300-310、310-320...390-400共10组),之间的faceToken和imgSavePath都有哪些

    最后实现的一种为:

    db.detectOriginalData.aggregate([
            {$match: {"faceDetail.location.width": {$lte: 400, $gte: 300}}},
            {$project: {val: "$faceDetail.location.width", ftk: "$faceDetail.face_token", imgPath: "$imgSavePath"}},
            {$group: {
                "_id": {
                    $subtract: [
                    {$subtract: ["$val", 0]},
                    {$mod: [{$subtract: ["$val", 0]}, 10]}
                    ]
                },
                ftkList: {$push: "$ftk"},
                imgList: {$push: "$imgPath"},
                ftkCount: {$sum: 1}
            }},
            {$sort: {_id: -1}}
    ])

    下面为开始用的绕了弯路的一种实现方式,可以忽略。。。

    db.detectOriginalData.aggregate([
            {$match: {"faceDetail.location.width": {$lte: 400, $gte: 300}}},
            {$project: {val: "$faceDetail.location.width", ftk: "$faceDetail.face_token"}},
            {$lookup:{
                from:"detectOriginalData",
                localField:"ftk",
                foreignField: "_id",
                as: "img"}
            },
            {$project: {val: 1, ftk: 1, imgPath: "$img.imgSavePath"}},
            {$unwind: "$imgPath"},
            {$group: {
                "_id": {
                    $subtract: [
                    {$subtract: ["$val", 0]},
                    {$mod: [{$subtract: ["$val", 0]}, 10]}
                    ]
                },
                ftkList: {$push: "$ftk"},
                imgList: {$push: "$imgPath"},
                ftkCount: {$sum: 1}
            }},
            {$sort: {_id: -1}}
    ])

    最后的结果如下(_id=320,代表width处于320-330之间的数据):

    ************2021-01-19 新增,测试小伙伴提了个统计需求。。。。。。

    先看统计数据关联的另一张表(过滤详情表detectFilterDetail),大概数据结构如下(只截取部分字段):

    {
        "_id" : ObjectId("5feaa27fd873663e8085507d"),
        "faceToken" : "2268048d7df15fa15652cc745261404e",
        "paramRecordId" : "5feaa273d873663e80855047",
        "paramBoolean" : {
            "ageMax" : true,
            "ageMin" : true,
            "qualityBlur" : true,
            "qualityOcclusionMouth" : true,
            "locationWidthMin" : false,
            "locationHeightMin" : false
        },
        "filterCount" : 2,
        "filterKey" : [ 
            "locationWidthMin", 
            "locationHeightMin"
        ],
        "cdt" : ISODate("2020-12-29T11:29:03.651+08:00")
    }

    现在是想要统计,detectFilterDetail表的detectFilterDetail.paramBoolean.qualityOcclusionMouse为true的分布,也就是和上一个统计一样,统计每个分段里面,为true的数量有多少

    琢磨了一会,大概实现sql如下:

    db.detectFilterDetail.aggregate([
            {$match: {"paramRecordId": "5feaa273d873663e80855047", "paramBoolean.qualityOcclusionMouth": true}},
            {$project: {flag: "$paramBoolean.qualityOcclusionMouth", ftk: "$faceToken"}},
            {$lookup:{
                from:"detectOriginalData",
                localField:"ftk",
                foreignField: "_id",
                as: "f_ftk"}
            },
            {$project: {flag: 1, ftk: 1, val: "$f_ftk.faceDetail.quality.occlusion.mouth"}},
            {$unwind: "$val"},
            {$group: {
                "_id": {
                    $subtract: [
                    {$subtract: ["$val", 0]},
                    {$mod: [{$subtract: ["$val", 0]}, 0.1]}
                    ]
                },
                ftkList: {$push: "$ftk"},
                ftkCount: {$sum: 1}
            }},
            //{$group: {"_id": null, count: {$sum: 1}}}
            {$sort: {_id: -1}}
    ])

    结果如下:

     PS:暂时做个记录,后续再稍微解释各个语句的大概作用

  • 相关阅读:
    用idea开发springboot项目,提示Cannot resolve symbol 'RequestMapping'
    idea中创建maven项目是项目结构缺失,只有pom.xml文件
    Mysql5.7.17解压版安装
    scp命令,Linux系统之间通过目录或文件
    有关Linux中文件权限笔记
    主机映射
    在Linux中配置系统环境变量
    找回因克隆丢失的eth0网卡
    Linux系统中安装jdk
    Linux常用命令(vi/vim文本编辑)
  • 原文地址:https://www.cnblogs.com/zz-3m23d-begining/p/14250420.html
Copyright © 2020-2023  润新知