Abfrage der letzten 30 Tage Datum Auswahl mit Mongoid und Ruby?
Wie gehe ich über die Abfrage eines Datumsbereichs (von sagen wir der letzten 30 Tage ab jetzt) mit Mongoid und Ruby?
Brauche ich, um am Ende mit einem array oder hash wie folgt:
{
15 => 300,
14 => 23,
13 => 23
...
30 => 20 # Goes over into previous month
28 => 2
}
Ich bin derzeit speichern jedes Dokument mit einer DateTime-Instanz sowie einen unix-timestamp Integer-Feld.
Den Schlüssel in die oben genannten hash sind die Tage und die Werte sind die Summe aller Verkäufe für diese Tage.
Irgendwelche Ideen?
InformationsquelleAutor SeanNieuwoudt | 2011-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, wie zu tun es alle in rubyland:
Dadurch wird ein hash mit "Monat-Tag" - Tasten, Grund, dass manche Monate weniger als 30 Tage und wird in einem Schlüssel Kollision, wenn die Abfrage ist immer der 30.
Wenn Sie einen anderen Bereich wollen, ändern Sie die Abfrage:
Ändern
created_at
das, was der name Ihres datetime-Feld ist.Wenn die Verwendung
2012-06-16
statt(Date.today - 30)
dann, wie Sie schreiben-Abfrage?Konvertieren Sie die Zeichenfolge in ein Datum-Objekt zuerst.
Date.parse("2012-06-16")
dies ist weit von einer perfekten Lösung, die Antworten unten sind viel besser.
Verkauf.wo(:end_date.gte => (Datum.heute): begin_date.lte => (Datum.heute)).Bestellung(begin_date: :desc)
InformationsquelleAutor Dan Healy
Gibt es einen einfacheren Weg:
Zeit anpassen Bereich zu entsprechen.
Dies erfordert ActiveSupport für die .Tage.Wochen Teil
Ich glaube nicht, dass Sie können mehrere Parameter mit der hash-syntax auf diese Weise. Kann falsch sein aber.
es ist ein einzelnes argument vom Typ Range. ruby-doc.org/core-2.0.0/Range.html
Range
in ruby ist sehr teure. Obwohl schön, syntax, ich würde wählen, tun dasgte
undlte
InformationsquelleAutor tomblomfield
Können Sie auch schreiben Sie die Abfrage mithilfe der
between
Methode wie:InformationsquelleAutor alup
Was, wenn Sie vergessen haben, setzen Sie Zeitstempel in Ihrem Modell? 🙁
Kein problem! Verwenden Sie einfach den timestamp in die BSON:ObjectId
Der Verkauf in den letzten 30 Tagen.
Da die
id
Feld-index, dies kann sehr wohl die Schnellste Abfrage.Müssen Sie einen Datumsbereich? Kuchen.
Der Verkauf vom letzten Monat.
Natürlich in diesem Beispiel wird davon ausgegangen, Schienen Datum Helfer...
InformationsquelleAutor campeterson
Dies erreichen Sie beispielsweise, indem Sie einen
map_reduce
Anruf über Ihre Sammlung mit einer map-Funktion nur mit den entsprechenden Einträgen (die, deren Datumswert größer als was auch immer Bedingung, die Sie es geben).Probieren Sie etwas wie dieses:
Könnte.
InformationsquelleAutor Frost