我有一个集合,它在MongoDB数据库中存储孩子的出生日期和时间。用户可以创建一个时隙,并基于该用户可以在该特定时隙中生成子细节。例如,对于今天的用户选择,08:00 am-09:30 am,用户可以在屏幕上看到详细信息,这是我能够成功完成的。
我找不到孩子们在任何时间段都不摔倒的细节。例如,用户创建了4个时隙[08:00 am-09:30 am,11:00 am-12:00,2:30 pm-6:30 pm,09:00 pm-09:30 pm],我想获取不属于四个时隙中任何一个时隙的孩子的详细信息。
首先,我将检索slot集合中的插槽,然后从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' } } },
]
请帮助我检索不属于任何槽的细节。我不能发布那个部分,因为我不能把它做对,或者我不知道如何实现它,我试着使用$not,但是没有成功。
请让我知道,如果需要进一步澄清以上任何细节。
最佳答案
我认为您的流程可以简化,并且可以立即得到您想要的结果,而无需像您所说的那样“迭代”。
假设我们使用问题中提到的四个时隙,我们正在寻找今天的结果。我会这样做,这将在一次点击中对结果进行分类:
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" }
}}
];
在管道阶段为分组实际建立“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”值。
因此,在nested
$cond
的lttle帮助下,您可以在一个查询中获得所有结果。