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
}
}
}
])
先大范围过滤数据,再提取子节点数据并转型,最后进行指定值过滤
网友评论