2016-12-22 11 views
0

ich mich verbrannt habe ziemlich schlecht diese Woche raus! Ich versage mit der Behebung eines Fehlers, der mit ein paar grundlegenden mathematischen Methoden gelöst werden sollte.Suche Objekte, die Zeitstempel ist größer als X Tage

Ich habe einige "Event" -Objekte in meiner mongodb-Datenbank, sie werden mit einem Datumsfeld erstellt, in einem pre-save-Hook berechne ich den Tag der Jahreszahl und lege diesen auf das Modell. Z.B.

1. Januar = 1

5. Januar = 5

31. Dezember = 365

Nutzer meiner App kann für Veranstaltungen suchen, die X Tage vor dem aktuellen Datum. Meine Abfrage ist etwas wie:

{ 
    day_number: { $gte: start_day, $lte: end_day} 
} 

Jetzt ist das Ende des Jahres gekommen, es gibt einen Logikfehler.

Lassen Sie uns für die Eingänge 22. Dezember 2 bis Jan sagen

Meine Frage geht:

{ 
    day_number: { $gte: 356, $lte: 2} 
} 

Das ist natürlich keine Ergebnisse, da keine Zahl größer als oder gleich 356 und weniger als oder gleich 2.

Irgendwelche Vorschläge für eine Lösung für dieses Problem, die keine Metzgerei eine obwohl gebrochen, aber einfache Abfrage umfasst?

+0

Vielleicht 'DAY_NUMBER: {$ gte: start_day, $ lte: (end_day RobG

Antwort

1

Eine Mehrheit der Zeitberechnungen in Computersystemen verwenden, um die Anzahl der Millisekunden seit dem eher willkürlichen Zeitpunkt verstrichen 1970-01-01 00.00 als sortierbar Zeitvariable.

Sie könnten das gleiche Prinzip anwenden, aber verwenden Sie die Anzahl der Tage seit 2016.01.01, die Jan 2 == Tag 367 machen würde. Auf diese Weise braucht die Abfrage keine Änderung, Ihre "Hook" braucht nur eine kleine Mod .

+0

Interessant, lassen Sie mich das verarbeiten und zu Ihnen zurückkommen. Mein Gehirn hat s gegangen ** t diesen Abend zu viele Stunden in diesem Monat, ich werde den Stift und Papier und komme zurück und upvote/nehmen zu gegebener Zeit erhalten. Beifall für Ihre Eingabe :) –

2

Sie können testen, ob das Ende Tag kleiner als der Starttag ist und dann Ende Tag einstellen wie folgt:

var start_day; 
 
var end_day; 
 
var numDaysInbetween = 0; 
 
var day_number = {} 
 

 
/* test 1 */ 
 
start_day = 50; 
 
end_day = 55; 
 

 
/* test 2 */ 
 
start_day = 356; 
 
end_day = 2; 
 

 
if (start_day > end_day) { 
 
    end_day += 365; 
 
} 
 
day_number = { $gte: start_day, $lte: end_day }; 
 

 
alert(day_number.$lte - day_number.$gte);

+1

Das ist genau das, was ich auf dem Papier bin nun dabei :) –

+0

Ich komme später wieder an diesem Abend und upvote/akzeptieren Antwort (en) :) –

+1

Dank! Froh, dass ich helfen konnte. – haltersweb

Verwandte Themen