10-Mongodb 节点查询、聚合查询及类型转换

1、需求背景

数据结构如下

{
    "_id": ObjectId("5df397720c562263dcad6e36"),
    "DataGatherCode": "xxxxxxxxxxxxxxx",
    "MonitorTime": ISODate("2019-12-13T13:50:41.000Z"),
    "Type": "RealTimeData",
    "DataList": [
        {
            "PollutantCode": "001",
            "AvgStrength": "100.0000"
        },
        {
            "PollutantCode": "002",
            "AvgStrength": "999999"
        }]
      ...
}
...

查询大于指定值的监测数据

2、查询方式一,子节点查询

db.getCollection("空间").find({
    "MonitorTime": {
        $gte: ISODate("2019-12-11T12:10:30.000+0800"),
        $lte: ISODate("2019-12-31T12:40:30.000+0800")
    },
    "DataList": {
        "$elemMatch": {
            "AvgStrength": {  $gt: '18' }
        }
    }
})

直接使用elemMatch查询子节点,但因节点中数据类型为字符串,不满足需求,如类型一致可直接使用,直接明了

3、查询方式二,聚合,统计,类型转换

db.getCollection("空间").aggregate([
    {
        $match: {
            "MonitorTime": {
                $gte: ISODate("2019-12-11T12:10:30.000+0800"),
                $lte: ISODate("2019-12-18T12:40:30.000+0800")
            }
        }
    },
    {
        $unwind: "$DataList"
    },
    {
        $project: {
            "序列号": "$DataGatherCode",
            "监测时间": {
                $dateToString: {
                    format: "%Y-%m-%d %H:%M:%S:%L",
                    date: "$MonitorTime",
                    timezone: "+08"
                }
            },
            "监测项目": "$DataList.PollutantCode",
            "监测值": {
                $toDouble: "$DataList.AvgStrength"
            }
        }
    },
    {
        $match: {
            "监测值": {
                $gt: 18
            }
        }
    }
])

先大范围过滤数据,再提取子节点数据并转型,最后进行指定值过滤

你可能感兴趣的:(10-Mongodb 节点查询、聚合查询及类型转换)