2015-01-12 11 views
8

Von Java-Treiber, ich möchte ein Dokument speichern, die wie in MongoDB unter jsonSo speichern Sie den Timestamp-Typ in MongoDb | Java

{ "ts" : Timestamp(1421006159, 4)} 

Optionen Ich habe versucht, sieht.

Option 1: Karte doc = new HashMap (1);

doc.put("ts", new BSONTimeStamp()); 

Es ergibt sich die unten nicht erforderlich Format

{"ts" : { 
     "_inc" : 0, 
     "_class" : "org.bson.types.BSONTimestamp" 
    }} 

Option 2:

doc.put("ts",new Timestamp(new Date().getTime())); 

es ergibt sich:

{"ts" : ISODate("2015-01-12T05:36:43.343Z")} 

Antwort

4

verwendete ich den folgenden Witz h der Standard-mongodb-java-Treiber (keine Federdaten).

DBObject doc= new BasicDBObject(); 
doc.put("ts", new BSONTimeStamp(1421006159, 4)); 

Und das MongoDB Ergebnis für einen Fund ist:

{ "_id" : ObjectId("54b396da7fe45ee2d6c5e03a"), "ts" : Timestamp(1421006159, 4) } 

So ist die Serialisierung von BSONTimeStamp auf die Klassennamen und die Klassen-Attribute ein, ihre Werte hängen von dem federDaten mongodb Serializer. Sie sollten den Standard-Java-Mongodb-Treiber verwenden oder Java Date und das ISODate Format in MongoDB verwenden.

Oder Vielleicht können Sie den Spring-Data-Mongodb-Serializer erweitern und schreiben Sie Ihren eigenen Serializer und Deserializer für die Klasse BSONTimeStamp, um den MongoDB-Timestamp-Typ zu verwenden.

+0

Sie sind absolut richtig. Ich habe es auch gleich versucht und es funktioniert mit einem einfachen mongodb-java-Treiber. Aber nicht mit Frühling. Ich versuchte auch, den Mongokonverter zu überschreiben, um _class Schlüssel zu vermeiden, aber dennoch funktioniert es nicht. Könnte im Frühjahr ein Fehler sein. – hellojava

4

Von MongoDB sie empfohlen wird ein Datum zu speichern, da BSON Zeitmarke für den internen Gebrauch ist:

http://docs.mongodb.org/manual/reference/bson-types/#timestamps

Der Unterschied ist, daß seit mehr Darstellungsbereich hat seitdem eine ganze Zahl ist 64-Bit, die die Anzahl der Millisekunden darstellt seit Unix-Epoche.

In BSON Timestamp haben nur 32 Bits diesen Zweck; die anderen 32 Bits sind eine inkrementelle ordinale Ganzzahl innerhalb einer Sekunde, um die Eindeutigkeit des Wertes sicherzustellen. Ich nehme an, das ist der Grund, warum sie Timestamp in oplog verwenden.

Wenn du nichts dagegen hast Einzigartigkeit Ich empfehle ein Datum (aka isodate) zu verwenden, so dass die Option 2 oder Option 3:

doc.put("ts", new Date()); 
+0

Ist das von der Java Default Lib? "neues Datum()"? –

Verwandte Themen