2015-07-07 5 views
6

Wie kann ich nach einem Datumsfeld Abfrage in MongoDB mit dem Datum nur, und nicht mal? Zum Beispiel, wenn MongoDB speichert 7. Juli 2015 mit jede Zeit, möchte ich mit dem heutigen Datum nur an diesem Tag entsprechen.MongoDB Vergleich Daten nur ohne mal

In MySQL, würde ich SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW());

Hinweis tun, wie MySQL eine Funktion hat, die DATE_FIELD zu dem Zeitpunkt beim Abgleich nur zu ändern. Kann ich dies in MongoDB mit einer ähnlichen Funktion während des Abgleichs tun? Wie Collection.find({ dateonly(datetimefield): dateonly(new Date() }); oder etwas Ähnliches?

Ich verstehe Mongo speichert Datum/Uhrzeit in GMT, also müsste ich auch das gespeicherte GMT Datum + Zeit von GMT zu Local konvertieren, bevor Sie nur das Datum übereinstimmen, aber um mich zu starten, möchte ich wissen, ob ich kann streichen Sie die Zeit für ein Date Match. Zum Beispiel, wenn GMT jetzt 8. Juli um 03.00 Uhr ist, aber Östliche Eastern Time US ist 7. Juli um 23:00 Uhr, dann würde ich 7. Juli übereinstimmen.

+0

Was ist das Format Datum in Ihrem mongoDB? –

+1

Das Datumsfeld Format ist das gleiche wie das Objekt Javascript Datums. Wie: 'neues Datum()'. –

+1

Denken Sie jetzt darüber nach ... vielleicht ist die beste Lösung, ein anderes Feld im numerischen Format zu speichern, das das lokale Datum darstellt? Wie 20150706 für JJJJMMTT? Dann machen Sie einfach numerische Vergleiche? –

Antwort

1

So klingt es wie kein mongodb entspricht MySQL ist DATE Funktion, wie mit SELECT col1, col2 FROM table WHERE DATE(date_field) = DATE(NOW())

Anstelle einer nativen Lösung, ich löste dies durch die Verwendung MomentJS Zeitzone (http://momentjs.com/timezone/) zu konvertieren Datum/Uhrzeit zu einem Zeitpunkt nur für numerisches Feld, dann speichere ich das Datum als eine Zahl.

In meinem Javascript-Code (außerhalb von MongoDB):

var localDate = function(timezone, d) { 
    if (d == undefined) { d = new Date(); } // current date/time 
    return Number(moment(d).tz(timezone).format("YYYYMMDD")); 
} 

Dann speichere ich nur das Datum Feld im Datensatz Mongo.

var myDate = localDate("America/New_York"); // today, in YYYYMMDD number 
db.birthdays.insert(
    { dateonly: myDate, event: "This day is my birthday!" } 
); 

Da ist in meinem Javascript-Code, kann ich abfragen leicht heute, morgen, 2 Tage ab jetzt, usw.

// today 
var myDate = localDate("America/New_York"); 
db.birthdays.find({ dateonly: myDate }); 

// tomorrow 
var myDate = localDate("America/New_York", new Date(new Date().setDate(new Date().getDate() + 1))); 
db.birthdays.find({ dateonly: myDate }); 

// someone in Paris wants to know birthdays on the calendar in 7 days 
var myDate = localDate("Europe/Paris", new Date(new Date().setDate(new Date().getDate() + 7))); 
db.birthdays.find({ dateonly: myDate }); 

hoffe, das hilft jemand.

2

Ich denke, Sie sollten eine Bereichsabfrage zwischen dem Start von machen der Tag und sein Ende (oder ohne Ende, wenn Sie heute sprechen). So etwas wie diese

db.collection.find({ 
    "date" : {"$gte": new Date("2015-07-07T00:00:00.000Z"), 
      "$lt": new Date("2015-07-08T00:00:00.000Z")} 
}) 
0

habe ich eine Kombination der Antworten von Crash_Override und Maxim_PontyUshenko. Verwenden Sie Moment.js und die $ gt, $ lt-Mongo-Operatoren.

ship_date: { 
    $lt: moment().hours(0).minutes(0).seconds(0).milliseconds(0).add(28, "days").toDate(), 
    $gte: moment().hours(0).minutes(0).seconds(0).milliseconds(0).toDate() 
} 
1

Das ist meine vorgeschlagene Lösung:

db.collection.find({ 
    $and: [ 
    {"date": {$gte: new Date("2015-07-07T00:00:00.000Z")}}, 
    {"date": {$lt: new Date("2015-07-08T00:00:00.000Z")}} 
    ] 
}) 
+0

Herkömmliche Datum/Uhrzeit-Felder werden kompliziert, wenn sie sich auf spezielle Kalendertage wie Jahrestag oder Geburtstag beziehen. Um den Code einfach zu machen, speichere ich jetzt ein "Zahl" -Feld im Format YYYYMMDD. Einfach diese Zahl in eine Zeichenkette umzuwandeln und dann zu sehen, ob die letzten 4 Ziffern (der MMDD Teil) mit dem aktuellen Benutzer Monat und Tag übereinstimmen. Wenn ja, wünsche ich ihnen alles Gute zum Geburtstag. Wenn dies mit einem herkömmlichen Datumsfeld gemacht würde, müsste ich Zeitzonenumwandlungen durchführen, um festzustellen, ob sie sich in einer Zeitzone befinden, in der ihr Geburtstag der aktuelle Tag ist. –