Mongodb每天都会获得最后一小时

时间:2016-02-16 15:14:36

标签: mongodb aggregation-framework

我在mongodb中有以下架构,其中时间戳是每小时级别的时间戳

{
    "day_chan1" : 54.464,
    "day_chan2" : 44.141,
    "day_chan3" : 44.89,
    "gatewayId" : "443719005AA3",
    "timestamp" : ISODate("2016-02-15T23:00:00.000Z"),
    "total_curr_chan" : 5.408,
    "total_day_chan" : 143.495,
    "type" : 1
}

我希望能够查询过去7天和30天的最后一个时间戳。为了做到这一点,我想做一些像

这样的事情
    var d = new Date(); // today!

for(var i =1; i <= 7; i++) {

        var n = i; // go back n days!
        d.setDate(d.getDate() - n);
        d.setHours(23,0,0);

    var query =  {
        gatewayId: req.params.deviceId,
        timestamp: { $lt: new Date(d) }
    };

       db
        .find(query,function(resp) {
            //return the data here 
        });
    }

但这会产生多个回调问题,我想知道是否有更简单的方法可以使用聚合或其他方法

2 个答案:

答案 0 :(得分:1)

使用 $hour 运算符中的 $project 运算符提取时间戳的小时部分,然后使用 {{进行查询3}} 过滤不符合给定小时标准的文档:

var pipeline = [
    {
        "$project": {
            "day_chan1": 1,
            "day_chan2": 1,
            "day_chan3": 1,
            "gatewayId": 1,
            "timestamp": 1,
            "total_curr_chan": 1,
            "total_day_chan": 1,
            "type": 1,
            "hour": { "$hour": "$timestamp" }
        }
    },
    { "$match": { "hour": 23 } }
];

collection.aggregate(pipeline, function(err, result) {
    //return the data here 
    console.log(result);
});

答案 1 :(得分:0)

对于任意的最后一小时,它必须更复杂一些:

db.collection.aggregate([
    {$match:{
        timestamp:{$type: "date"}}
        // add date constraints here
    }, 
    {$project:{
        _id:1, 
        date:{"y":{$year:"$timestamp"}, "d":{$dayOfYear:"$timestamp"}},
        doc:"$$CURRENT"}
    },
    {$group:{
        _id:"$date", 
        maxtime: {$max:"$doc.timestamp"}, 
        doc:{$push:"$doc"}}
    },
    {$unwind:"$doc"},
    {$project:{
        latest: {$cmp: ["$maxtime", "$doc.timestamp"]}, 
        doc:"$doc"}
    },
    {$match:{"latest":0}}
])

使用map-reduce它应该更简单,但可能更慢。