【问题标题】:MongoDB Aggregation DataMongoDB聚合数据
【发布时间】:2017-02-18 19:58:38
【问题描述】:

我是 Mongo Aggregation 的新手并拥有这些数据

{
"_id": {

        "$oid": "5654a8f0d487dd1434571a6e"
    },

    "ValidationDate": {
        "$date": "2015-11-24T13:06:19.363Z"
    },

    "DataRaw": " WL 00100100012015-08-28 02:44:17+0000+ 16.81 8.879  1084.00",

    "ReadingsAreValid": true,

    "locationID": " WL 001",

    "Readings": {

        "pH": {
            "value": 8.879
        },

        "SensoreDate": {
            "value": {
                "$date": "2015-08-28T02:44:17.000Z"
            }
        },

        "temperature": {
            "value": 16.81
        },

        "Conductivity": {
            "value": 1084
        }
    },
    "HMAC":"ecb98d73fcb34ce2c5bbcc9c1265c8ca939f639d791a1de0f6275e2d0d71a801"
}

我的目标是计算每两小时间隔的平均温度,然后计算每月、每年和每周的平均温度。我尝试了各种查询,但没有运气。这是我迄今为止尝试过的

data.aggregate([{"$unwind":"$Readings"}, 

{"$project":{"HourRecord":{"$hour":"Readings.SensoreDate.value"}, 

"YearRecord":{"$year":"$Readings.SensoreDate.value"}}},

{'$group' : {'_id' : "$locationID", 
'AverageTemp' : { '$avg' : '$Readings.temperature.value'}}}
])

我得到一个像这样的空结果

{u'ok': 1.0, u'waitedMS': 0L, u'result': [{u'AverageTemp': None, u'_id': None}]}

我尝试了其他几种组合,但结果仍然为空。

以下查询每小时、每月等返回所需的结果,但如何按两小时间隔而不是一小时分组

 test_Agg.aggregate([{"$unwind":"$Readings"},
{"$project":{              "HourRecord": { "$hour":"$Readings.SensoreDate.value"},
                           "YearRecord": {"$year":"$Readings.SensoreDate.value"},
                           "MonthRecord": {"$month":"$Readings.SensoreDate.value"},
                           "locationID" : 1,
                           "Readings.pH.value":1,
                           'Readings.temperature.value' : 1}
},
{'$group' : {'_id' :"$HourRecord",
'AverageTemp' : { '$avg' : '$Readings.temperature.value'}}
}])

【问题讨论】:

    标签: mongodb python-2.7 pymongo aggregation-framework mongodb-aggregation


    【解决方案1】:

    查询中的第二个管道$project 未投影后续管道中使用的所需值。因此,结果为空。

    必填字段已添加到$project。试试下面的查询。

    db.temperature.aggregate([{"$unwind":"$Readings"}, 
    {"$project":{              "HourRecord": { "$hour":"$Readings.SensoreDate.value"}, 
                               "YearRecord": {"$year":"$Readings.SensoreDate.value"},
                               locationID : 1,
                               'Readings.temperature.value' : 1}
    },
    {'$group' : {'_id' : "$locationID", 
    'AverageTemp' : { '$avg' : '$Readings.temperature.value'}}}                           
    ]);
    

    帖子中提供的一个文档的输出:-

    {
        "_id" : " WL 001",
        "AverageTemp" : 16.81
    }
    

    【讨论】:

    • 谢谢这工作。我尝试将每小时的读数分组,但我如何每两个小时进行一次。我尝试了一些选项,但无法获得它。
    • 谢谢。我应该怎么做才能按每两个小时的间隔而不是 $locationID 进行分组。上面的查询适用于每小时、每月、每周?
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2021-07-26
    • 2018-04-13
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多