不在特定时隙中的聚合数据

我有一个收集,它存储在MongoDB数据库中的时间的孩子的出生date。 用户可以创build一个插槽,并根据该用户可以在该特定的时间段出生的孩子细节。 例如今天的用户select,08:00 AM – 09:30 AM,用户可以看到屏幕上的细节,我可以成功完成。

我无法获取不在任何时间段的孩子的细节。 例如,用户创build了4个时间段[08:00 AM – 09:30 AM,11:00 AM – 12:00,2:30 PM – 6:30 PM,09:00 PM – 09:30 PM],我想要获取不属于四个时间段的孩子的细节。

首先,我将检索槽收集中存在的槽,然后遍历nodejs API中的每个槽并将其发送到下面的代码并检索详细信息。

[ { $match : {'BornTime': {$gte: start, $lte: end} } }, { $project:{ "_id": 0, "name":{$concat: [ {$cond:[{ $eq: ['status', 1] }, "Children Born", ""]}, {$cond:[{ $eq: ['status', 0] }, "Children Died", ""]}, ]}, "childcount":'childcount'}}, { $group: { _id: '$name', count: { $sum: 1 } , covers: { $sum: '$childcount' } } }, ] 

请帮我检索不属于任何插槽的细节。 我无法发布那部分,因为我不能正确的或者我不知道如何实现它,我试图使用$不是,但不能成功。

请让我知道是否需要更多的澄清上述任何细节。

我认为你的过程可以简化,也可以一次性得到你想要的结果,而不需要像你说的那样“迭代”

假设我们使用问题中提到的四个插槽,我们正在寻找今天的结果。 我会做到这一点,将结果归类于一个命中:

 var today = new Date("2015-08-11T00:00:00.000Z"), tomorrow = new Date("2015-08-12T00:00.000Z"), slots = [ [new Date("2015-08-11T08:00:00.000Z"),new Date("2015-08-11T09:30:00.000Z")], [new Date("2015-08-11T11:00:00.000Z"),new Date("2015-08-11T12:00:00.000Z")], [new Date("2015-08-11T14:30:00.000Z"),new Date("2015-08-11T18:30:00.000Z")], [new Date("2015-08-11T21:00:00.000Z"),new Date("2015-08-11T21:30:00.000Z")] ]; var stack = []; for (var i = slots.length-1; i >= 0; i--) { var rec = { "$cond": [ { "$and": [ { "$gte": [ "$BornTime", slots[i][0] ]}, { "$lte": [ "$BornTime", slots[i][1] ]} ]}, i ] }; if ( stack.length == 0 ) { rec["$cond"].push("noSlot"); } else { var lval = stack.pop(); rec["$cond"].push(lval); } stack.push(rec); } var pipeline = [ // Match today { "$match":{ "BornTime": { "$gte": today, "$lt": tomorrow } } }, // Group { "$group": { "_id": { "name": { "$cond": [ { "$eq": [ "$status", 1 ] }, { "$literal": "ChildrenBorn" }, { "$literal": "ChildrenDied" } ] }, "slot": stack[0] }, "count": { "$sum": 1 }, "covers": { "$sum": "$childcount" } }} ]; 

这实际上在pipe道阶段为这个分组build立了“slot”条目,如下所示:

 { "$cond" : [ { "$and" : [ { "$gte" : [ "$BornTime", ISODate("2015-08-11T08:00:00Z") ] }, { "$lte" : [ "$BornTime", ISODate("2015-08-11T09:30:00Z") ]} ] }, 0, { "$cond" : [ { "$and" : [ { "$gte" : [ "$BornTime", ISODate("2015-08-11T11:00:00Z") ] }, { "$lte" : [ "$BornTime", ISODate("2015-08-11T12:00:00Z") ] } ] }, 1, { "$cond" : [ { "$and" : [ { "$gte" : [ "$BornTime", ISODate("2015-08-11T14:30:00Z") ] }, { "$lte" : [ "$BornTime", ISODate("2015-08-11T18:30:00Z") ] } ] }, 2, { "$cond" : [ { "$and" : [ { "$gte" : [ "$BornTime", ISODate("2015-08-11T21:00:00Z") ] }, { "$lte" : [ "$BornTime", ISODate("2015-08-11T21:30:00Z") ] } ] }, 3, "noSlot" ] } ] } ] } ] 

}

因此,根据当前“BornTime”值落入每个插槽的位置返回每个“插槽编号”。 如果它不属于任何插槽,则返回“noSlot”值。

所以,从嵌套的$cond获得一个帮助,你可以在一个查询中获得所有的结果。

 var slotes = ;// init from req.body var bortTimeSlotes = []; for(var i=0; i<slotes.length; i++){ var slot = { "bornTime" : { "$lt" : slotes[i].startdate, "$gt": slotes[i].endDate } }; bortTimeSlotes.push(slot); } db.childrenModel.find( { "$and" : [ bortTimeSlotes ] } )