我以日期时间格式存储了happyHours酒店。现在我想取所有happyHours大于当前时间的酒店。
据我所知,我知道有获取结果的日期比较,但这将比较整个日期时间对象。
有没有办法比较时间?
数据库中的Happyhours日期对象示例:
"happyHours" : {
"mon" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
],
"tue" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
],
"wed" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
],
"thu" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
],
"fri" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
],
"sat" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
],
"sun" : [
{
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
]
}
答案 0 :(得分:1)
首先,当前架构不利于查询;在这种情况下,数组实际上并不是必需的,如果你要将工作日作为键,那么更好的方法是丢失数组并引用元素:
"happyHours": {
"mon": {
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
},
...
"sun": {
"startTime" : ISODate("2016-04-11T06:30:59.000Z"),
"endTime" : ISODate("2016-04-11T14:30:59.000Z")
}
}
然而,一个更好的设计使得查询更容易招手。您可以将happyHours
字段转换为一个数组,其中包含分别描述工作日,开始时间,开始分钟,结束时间和分钟的文档,如下所示:
"happyHours": [
{
"weekDay": "mon",
"startHour": 6,
"startMinutes": 30,
"endHour": 14
"endMinutes": 30
}
...
]
然后查询如下:
var now = new Date(),
days = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sun'],
weekDay = days[now.getDay()],
hour = now.getHours(),
minutes = now.getMinutes();
db.hotels.find({
"happyHours.weekDay": weekDay,
"happyHours.startHour": { "$lte": hour },
"happyHours.startMinutes": { "$lte": minutes },
"happyHours.endHour": { "$gte": hour },
"happyHours.endMinutes": { "$gte": minutes }
})
现在,如果您没有能力修改架构以符合上述建议,那么聚合框架提供了一种解决方法。考虑以下聚合管道,该管道利用 date aggregation operators 步骤中的$project
和后续 $match
管道中的查询:< / p>
var now = new Date(),
days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sun'],
weekDay = days[now.getDay()],
hour = now.getHours(),
minutes = now.getMinutes();
project = {
"$project": {
"otherfields": 1,
"happyHours": 1,
"happyHoursMonStartHour": { "$hour": "$happyHours.mon.startTime" },
"happyHoursMonStartMinutes": { "$minute": "$happyHours.mon.startTime" },
"happyHoursMonEndHour": { "$hour": "$happyHours.mon.endTime" },
"happyHoursMonEndMinutes": { "$minute": "$happyHours.mon.endTime" },
"happyHoursTueStartHour": { "$hour": "$happyHours.tue.startTime" },
"happyHoursTueStartMinutes": { "$minute": "$happyHours.tue.startTime" },
"happyHoursTueEndHour": { "$hour": "$happyHours.tue.endTime" },
"happyHoursTueEndMinutes": { "$minute": "$happyHours.tue.endTime" },
"happyHoursWedStartHour": { "$hour": "$happyHours.wed.startTime" },
"happyHoursWedStartMinutes": { "$minute": "$happyHours.wed.startTime" },
"happyHoursWedEndHour": { "$hour": "$happyHours.wed.endTime" },
"happyHoursWedEndMinutes": { "$minute": "$happyHours.wed.endTime" },
"happyHoursThuStartHour": { "$hour": "$happyHours.thu.startTime" },
"happyHoursThuStartMinutes": { "$minute": "$happyHours.thur.startTime" },
"happyHoursThuEndHour": { "$hour": "$happyHours.thu.endTime" },
"happyHoursThuEndMinutes": { "$minute": "$happyHours.thu.endTime" },
"happyHoursFriStartHour": { "$hour": "$happyHours.fri.startTime" },
"happyHoursFriStartMinutes": { "$minute": "$happyHours.fri.startTime" },
"happyHoursFriEndHour": { "$hour": "$happyHours.fri.endTime" },
"happyHoursFriEndMinutes": { "$minute": "$happyHours.fri.endTime" },
"happyHoursSatStartHour": { "$hour": "$happyHours.sat.startTime" },
"happyHoursSatStartMinutes": { "$minute": "$happyHours.sat.startTime" },
"happyHoursSatEndHour": { "$hour": "$happyHours.sat.endTime" },
"happyHoursSatEndMinutes": { "$minute": "$happyHours.sat.endTime" },
"happyHoursSunStartHour": { "$hour": "$happyHours.sun.startTime" },
"happyHoursSunStartMinutes": { "$minute": "$happyHours.sun.startTime" },
"happyHoursSunEndHour": { "$hour": "$happyHours.sun.endTime" },
"happyHoursSunEndMinutes": { "$minute": "$happyHours.sun.endTime" },
}
},
match = { "$match": {} },
pipeline = [
{ "$unwind": "$happyHours.mon" },
{ "$unwind": "$happyHours.tue" },
{ "$unwind": "$happyHours.wed" },
{ "$unwind": "$happyHours.thur" },
{ "$unwind": "$happyHours.fri" },
{ "$unwind": "$happyHours.sat" },
{ "$unwind": "$happyHours.sun" }
];
match["$match"]["happyHours"+ weekDay +"StartHour"] = { "$lte": hour };
match["$match"]["happyHours"+ weekDay +"StartMinutes"] = { "$lte": minutes };
match["$match"]["happyHours"+ weekDay +"EndHour"] = { "$gte": minutes };
match["$match"]["happyHours"+ weekDay +"EndMinutes"] = { "$gte": minutes };
pipeline.push(project);
pipeline.push(match);
db.hotels.aggregate(pipeline);
在使用printjson(pipeline)
运行管道之前打印管道会显示:
[
{
"$unwind" : "$happyHours.mon"
},
{
"$unwind" : "$happyHours.tue"
},
{
"$unwind" : "$happyHours.wed"
},
{
"$unwind" : "$happyHours.thur"
},
{
"$unwind" : "$happyHours.fri"
},
{
"$unwind" : "$happyHours.sat"
},
{
"$unwind" : "$happyHours.sun"
},
{
"$project" : {
"otherfields" : 1,
"happyHours" : 1,
"happyHoursMonStartHour" : {
"$hour" : "$happyHours.mon.startTime"
},
"happyHoursMonStartMinutes" : {
"$minute" : "$happyHours.mon.startTime"
},
"happyHoursMonEndHour" : {
"$hour" : "$happyHours.mon.endTime"
},
"happyHoursMonEndMinutes" : {
"$minute" : "$happyHours.mon.endTime"
},
"happyHoursTueStartHour" : {
"$hour" : "$happyHours.tue.startTime"
},
"happyHoursTueStartMinutes" : {
"$minute" : "$happyHours.tue.startTime"
},
"happyHoursTueEndHour" : {
"$hour" : "$happyHours.tue.endTime"
},
"happyHoursTueEndMinutes" : {
"$minute" : "$happyHours.tue.endTime"
},
"happyHoursWedStartHour" : {
"$hour" : "$happyHours.wed.startTime"
},
"happyHoursWedStartMinutes" : {
"$minute" : "$happyHours.wed.startTime"
},
"happyHoursWedEndHour" : {
"$hour" : "$happyHours.wed.endTime"
},
"happyHoursWedEndMinutes" : {
"$minute" : "$happyHours.wed.endTime"
},
"happyHoursThuStartHour" : {
"$hour" : "$happyHours.thu.startTime"
},
"happyHoursThuStartMinutes" : {
"$minute" : "$happyHours.thur.startTime"
},
"happyHoursThuEndHour" : {
"$hour" : "$happyHours.thu.endTime"
},
"happyHoursThuEndMinutes" : {
"$minute" : "$happyHours.thu.endTime"
},
"happyHoursFriStartHour" : {
"$hour" : "$happyHours.fri.startTime"
},
"happyHoursFriStartMinutes" : {
"$minute" : "$happyHours.fri.startTime"
},
"happyHoursFriEndHour" : {
"$hour" : "$happyHours.fri.endTime"
},
"happyHoursFriEndMinutes" : {
"$minute" : "$happyHours.fri.endTime"
},
"happyHoursSatStartHour" : {
"$hour" : "$happyHours.sat.startTime"
},
"happyHoursSatStartMinutes" : {
"$minute" : "$happyHours.sat.startTime"
},
"happyHoursSatEndHour" : {
"$hour" : "$happyHours.sat.endTime"
},
"happyHoursSatEndMinutes" : {
"$minute" : "$happyHours.sat.endTime"
},
"happyHoursSunStartHour" : {
"$hour" : "$happyHours.sun.startTime"
},
"happyHoursSunStartMinutes" : {
"$minute" : "$happyHours.sun.startTime"
},
"happyHoursSunEndHour" : {
"$hour" : "$happyHours.sun.endTime"
},
"happyHoursSunEndMinutes" : {
"$minute" : "$happyHours.sun.endTime"
}
}
},
{
"$match" : {
"happyHoursThuStartHour" : {
"$lte" : 9
},
"happyHoursThuStartMinutes" : {
"$lte" : 34
},
"happyHoursThuEndHour" : {
"$gte" : 34
},
"happyHoursThuEndMinutes" : {
"$gte" : 34
}
}
}
]