mit zu starten, das aktuelle Schema für die Abfrage nicht förderlich ist; die Arrays sind wirklich nicht notwendig, in diesem Fall, wenn Sie die Wochentage als Schlüssel zu halten waren dann der bessere Ansatz, die Arrays zu verlieren wäre und verweisen nur das Element:
"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")
}
}
jedoch eine viel bessere Design, das das Abfragen viel einfacher macht, winkt. Sie könnten das happyHours
Feld in ein Array umwandeln, die ein Dokument hält, die den Wochentag beschreibt, Stunde beginnen, starten Minuten, Ende Stunden und Minuten jeweils wie folgt:
"happyHours": [
{
"weekDay": "mon",
"startHour": 6,
"startMinutes": 30,
"endHour": 14
"endMinutes": 30
}
...
]
dann wäre die Abfrage wie folgt:
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 }
})
Wenn Sie jetzt nicht über die Möglichkeit verfügen, Ihr Schema so zu ändern, dass es den obigen Empfehlungen entspricht, bietet das Aggregationsframework eine Umgehungslösung. Betrachten Sie die folgende Aggregation Pipeline, die Verwendung des date aggregation operators im $project
Schritt und Abfrage in der nachfolgenden $match
Pipeline macht:
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);
die Pipeline Drucken, bevor es mit printjson(pipeline)
laufen würden Sie dies zeigen:
[
{
"$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
}
}
}
]
Wie können Sie die Happy Hours des Hotels in datetime halten? glückliche Stunden sollten unabhängig vom Datum sein, wenn ich richtig bin. – kadamb
Ja, ich stimme Ihrem Vorschlag zu. Aber das ist die Struktur der bestehenden db. Also versuche ich, sie nur durch den Zeitvergleich zu holen. – zulekha
und es wird Daten geben, auch aus der Vergangenheit? – kadamb