2017-09-24 4 views
1

Comment afficher le nombre de données de comptage par date et heure par intervalles de temps.Récupère les données en fonction du créneau temporel dans MongoDB

nous avons fentes

[{ 'startTime': "2017-04-20T08: 30: 00.000Z", 'endTime': « 2017-04-20T09: 30: 00.000Z « },

{ 'startTime': "2017-04-20T09: 30: 00.000Z", 'endTime': "2017-04-20T10: 30: 00.000Z"},

{ » startTime ': "2017-04-20T10: 30: 00.000Z", ' endTime ': "2017-04-20T18: 30: 00.000Z"}}

Entrée

[{ 
    "createdAt" : ISODate("2017-04-20T09:20:00.167Z"), 
}, 
{ 
    "createdAt" : ISODate("2017-04-20T14:20:00.167Z") 
}, 
{ 
    "createdAt" : ISODate("2017-04-20T11:20:00.167Z") 
}, 
{ 
    "createdAt" : ISODate("2017-04-20T14:20:00.167Z") 
}, 
{ 
    "createdAt" : ISODate("2017-04-20T12:20:00.167Z") 
}] 

Pour afficher les données dans ce format

sortie

[{ 'startTime': « 2017-04-20T08: 30: 00.000 Z ", 'endTime':" 2017-04-20T09: 30: 00.000Z ", 'compter': 1},

{ 'startTime': "2017-04-20T09: 30: 00.000Z", 'endTime': "2017-04-20T10: 30: 00.000Z", 'count': 0},

{ 'startTime': "2017-04-20T10: 30: 00.000Z", 'endTime': "2017-04-20T18: 30: 00.000Z"}, 'count': 4]

Répondre

0

Vous pouvez utiliser $gte de MongoDB (supérieur ou égal à), $lte (inférieur ou égal à), $gt (supérieur) et $lt (moins) pour spécifier une gamme de dates. Vous pouvez spécifier la date "de" dans $gte/$gt et la date "à" dans $lte/$lt.

Ainsi, votre requête devrait ressembler à ceci -

db.collection.count({createdAt: {$gte: "your from date in ISO date object format", $lte: "your to date in ISO date object format"}}, function (err, count){ 
    //whatever you wanna do with count 
}) 

ou

db.collection.find({createdAt: {$gte: "your from date in ISO date object format", $lte: "your to date in ISO date object format"}}).count(function (err, count){ 
    //whatever you wanna do with count 
}) 

pour chaque tranche de temps, vous devrez exécuter cela dans une boucle. Ainsi, tout comme un exemple, il ressemblerait -

db.collection.find({createdAt: {$gte: timeRangeArr[i].startTime, $lte: timeRangeArr[i].endTime}}).count(function (err, count){ 
    //whatever you wanna do with count 
}) 
+0

** Y at-il une autre méthode sans utiliser la boucle ** .suppose nous avons 10 à 20 fois slots alors vous devez itérer 10 -20 fois boucle en fonction des créneaux horaires et la requête va frapper 10 à 20 fois dans la base de données. –

+0

Je ne pense pas. La requête ne peut prendre que 1 $ gte/$ gtand 1 $ lte/$ lt qui ne peut avoir qu'une seule valeur. Donc, il faudra courir en boucle. Si vous êtes inquiet de les exécuter de manière synchrone, alors vous pouvez les exécuter en parallèle, Vérifiez le module npm appelé async - https://caolan.github.io/async/ –

1
var tempData = [], 

for(var i = 0; i <inputData.length ; i++){ 
    var condition = { 
     '$sum':{'$cond': 
       [{'$and': 
        [{'$gte': ['$checkinData.time', new Date(inputData[i].startTime)]}, 
         {'$lt' : ['$checkinData.time', new Date(inputData[i].endTIme)]} 
        ]},1,0] 
       } 
     } 

     tempData.push(condition); 
    } 
+0

Fournir quelques explications à la réponse à la question pourquoi/comment ce code résoudrait le problème. – VPK