2016-05-02 4 views
3

Ich habe happyHours von Hotels in Datum Uhrzeit Format gespeichert. Jetzt möchte ich alle Hotels holen, deren Happy Hours größer sind als die aktuelle Zeit.Können wir nur die Zeit in Mongodb vergleichen?

Nach meinem Wissen weiß ich, dass es einen Datumsvergleich mit Abrufergebnis gibt, aber dies wird das ganze Datum Zeitobjekt vergleichen.

Gibt es eine Möglichkeit, nur die Zeit zu vergleichen?

Happyhours Datum Objektprobe in db:

"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

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

+0

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

+0

und es wird Daten geben, auch aus der Vergangenheit? – kadamb

Antwort

0

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 
      } 
     } 
    } 
] 
+0

der Grund für das Hinzufügen von Array ist hier, dass Hotel happyhours in mehreren Slots für den gleichen Tag haben kann. Für zB 10 bis 11 dann am selben Tag 20 bis 23 so. – zulekha

+0

Hallo @zulekha Gibt es etwas in der Antwort, die nicht klar war? – chridam

+0

Vielen Dank für Ihre Zeit. Aber das wird für mich nicht funktionieren, wie ich zuvor erklärt habe, dass ich jeden Tag viele Happy-Hour-Slots haben kann. – zulekha

Verwandte Themen