2016-02-16 5 views
0

У меня есть следующие схемы в MongoDB, где метка времени на почасовой уровнеMongoDB получить lastHour за каждый день

{ 
    "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 
     }); 
    } 

Но это создает проблему множественных обратных вызовов, и я хочу знать, если есть более простой способ сделать это с помощью агрегатов или какой-либо другой метод

ответ

1

Используйте $hour оператора в пределах оператора $project извлечь час часть метки времени, затем запрос с $match фильтровать документы, которые не удовлетворяют заданным критериям час:

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); 
}); 
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}} 
]) 

С картой-свертка должно быть проще, но может быть медленнее.

Смежные вопросы