2017-09-24 56 views
1

如何按时间段显示按日期计数的数据数量。根据MongoDB中的时间段获取数据

我们有

[{ '开始时间': “2017-04-20T08:30:00.000Z”, 'ENDTIME':“2017-04-20T09:30:00.000Z “},

{ '开始时间': “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”}]

输入

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

要在这种格式显示数据

输出

[{ '开始时间':“2017-04-20T08:30:00.000 Z“, 'endTime':”2017-04-20T09:30:00.000Z“, 'count':1},

{ '开始时间': “2017-04-20T09:30:00.000Z”, 'ENDTIME': “2017-04-20T10:30:00.000Z”, '计数':0},

{ '开始时间': “2017-04-20T10:30:00.000Z”, 'ENDTIME': “2017-04-20T18:30:00.000Z”}, '计数':4]

回答

0

您可以使用MongoDB的$gte(大于或等于),$lte(小于或等于),$gt(大于) 和$lt(小于)来指定日期范围。您可以在$gte/$gt中指定“from”日期,在$lte/$lt中指定“to”日期。

所以您的查询应该是这样的 -

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

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

的时间每个插槽,你将不得不在一个循环中运行此。所以只是作为一个例子,它看起来像 -

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

**有没有使用循环任何其他方法** .suppose我们有10的20倍插槽,那么你必须重复10〜20次根据时隙循环查询,并在数据库中查询10-20次。 –

+0

我不这么认为。查询只能使用1 $ gte/$ gtand 1 $ lte/$ lt,它可以只有1个值。所以它将不得不循环运行。如果您担心以同步方式运行它们,那么可以并行运行它们,检查名为async的npm模块 - 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

请提供关于为什么/如何回答的一些解释这段代码可以解决这个问题。 – VPK