Beste Möglichkeit, Datum und Uhrzeit in Mongodb zu speichern

177

Ich habe gesehen, wie Zeichenfolgen, ganzzahlige Zeitstempel und Mongo-Datetime-Objekte verwendet wurden.

xrado
quelle

Antworten:

198

Der beste Weg ist nativer JavaScript speichern Date - Objekte , die auf der Karte BSON nativen Date - Objekte .

> db.test.insert({date: ISODate()})
> db.test.insert({date: new Date()})
> db.test.find()
{ "_id" : ObjectId("..."), "date" : ISODate("2014-02-10T10:50:42.389Z") }
{ "_id" : ObjectId("..."), "date" : ISODate("2014-02-10T10:50:57.240Z") }

Der native Typ unterstützt eine ganze Reihe nützlicher Methoden , die Sie beispielsweise in Ihren Jobs zur Kartenreduzierung verwenden können.

Bei Bedarf können Sie DateObjekte einfach mit der Methode bzw. dem Konstruktor in und aus Unix-Zeitstempeln 1) konvertieren .getTime()Date(milliseconds)

1) Genau genommen wird der Unix-Zeitstempel in Sekunden gemessen . Das JavaScript-Datumsobjekt misst seit der Unix-Epoche in Millisekunden .

Niels van der Rest
quelle
9
Wie wird das in der DB gespeichert? Als mongo datetime Objekt?
Thilo
2
@Thilo: MongoDB hat meines Wissens kein spezielles 'datetime'-Objekt. Es wird der JavaScript-Datumstyp verwendet, der in BSON-Form gespeichert ist.
Niels van der Rest
1
@Thilo: Richtig, das ist im Grunde die BSON-Darstellung eines JavaScript-Datumsobjekts. Es ist eine 64-Bit-Ganzzahl, die die Millisekunden seit der Unix-Epoche speichert und (die meisten?) Der Methoden aus der JavaScript-Spezifikation unterstützt .
Niels van der Rest
1
@AboozarRajabi Die 389und 240sind die Millisekunden des Zeitstempels. Die Zim String - Format erzählt MongoDB , dass der Zeitstempel Sie ist in UTC zur Verfügung gestellt. Wenn Sie es dann zurücklesen, konvertiert Ihre Anwendung es wahrscheinlich in Ihre lokale Zeitzone, sodass es so aussieht, als hätte sich die Zeit geändert. Aber die Zeit ist immer noch dieselbe, sie wird nur aus einer anderen Zeitzonenperspektive interpretiert. Zum Beispiel 12:50:42Zund 13:50:42+01:00repräsentieren den gleichen Zeitpunkt.
Niels van der Rest
5
@AboozarRajabi Im Allgemeinen möchten Sie sich nicht darum kümmern, wie es gespeichert wird, solange die anfängliche Eingabe korrekt ist. Wenn es 21:56:03+01:00jetzt in MEZ und Sie einfügen new Date(), dann MongoDB könnte repräsentieren sie als 20:56:03Z. Wenn Sie es jedoch zurücklesen und in Ihrer Anwendung mithilfe der lokalen Zeitzoneneinstellungen (MEZ) anzeigen, wird es 21:56:03erneut gelesen .
Niels van der Rest
53

Ein Datenstempel befindet sich bereits im _id-Objekt und repräsentiert die Einfügezeit

Wenn Sie also die Einfügezeit benötigen, ist sie bereits vorhanden:

Melden Sie sich bei mongodb shell an

ubuntu@ip-10-0-1-223:~$ mongo 10.0.1.223
MongoDB shell version: 2.4.9
connecting to: 10.0.1.223/test

Erstellen Sie Ihre Datenbank, indem Sie Elemente einfügen

> db.penguins.insert({"penguin": "skipper"})
> db.penguins.insert({"penguin": "kowalski"})
> 

Machen wir diese Datenbank zu der, in der wir uns gerade befinden

> use penguins
switched to db penguins

Holen Sie sich die Zeilen zurück:

> db.penguins.find()
{ "_id" : ObjectId("5498da1bf83a61f58ef6c6d5"), "penguin" : "skipper" }
{ "_id" : ObjectId("5498da28f83a61f58ef6c6d6"), "penguin" : "kowalski" }

Holen Sie sich jede Zeile im Format JJJJ-MM-TT HH: MM: SS:

> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds()) })
2014-12-23 3:4:41
2014-12-23 3:4:53

Wenn dieser letzte Einzeiler Sie verwirrt, habe ich eine Anleitung, wie das hier funktioniert: https://stackoverflow.com/a/27613766/445131

Eric Leschinski
quelle
18
Es ist jedoch der Zeitstempel für das Speichern des Dokuments in der Datenbank. Manchmal möchten Sie Datums- und Uhrzeitangaben speichern, die nicht mit dem Einfügedatum zusammenhängen.
Yuval A.
1
Wenn Ihre Datenbank sehr schnell ist und zwei Dokumente in derselben Millisekunde gespeichert sind, haben diese Dokumente dieselbe _id?
Redsandro
10
@ Redsandro nein, aber möglicherweise könnten sie das gleiche Ergebnis haben _id.getTimestamp().
kmiyashiro
@kmiyashiro, würdest du zufällig wissen, wie man nach diesem Zeitstempel sortiert?
Ledlogic
1
Nevermind, sort ({createdOn: -1); ist der Ansatz von stackoverflow.com/questions/28599237/… zu verwenden
ledlogic