2015-01-12 26 views
8

Od kierowcy Java, chcę, aby zapisać dokument, który wygląda jak poniżej json w MongoDBJak zapisać typ wartości datownika w MongoDb | Java

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

opcje próbowałem.

Opcja 1: Mapa doc = nowa HashMap (1);

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

Wynika to w poniżej nie wymaganym formacie

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

Opcja 2:

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

skutkuje:

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

Odpowiedz

4

Użyłem następujący dowcip h domyślny sterownik mongodb-java (brak danych sprężystych).

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

A wynik MongoDB o znalezisku jest:

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

Więc szeregowanie BSONTimeStamp do nazwy klasy i klasy przypisze ich wartości zależy od serializatora sprężynowy danych MongoDB. Powinieneś użyć domyślnego sterownika java-mongodb lub użyć Java Date i formatu ISODate w MongoDB.

A może mógłbyś rozszerzyć serwiser danych sprężynowych-mongodów i napisać własny serializator i deserializator dla klasy BSONTimeStamp, aby używać typu sygnatury czasowej MongoDB.

+0

Jesteś absolutnie prawo. Próbowałem również tego samego i działa z prostym sterownikiem mongodb-java. Ale nie ze Spring. Próbowałem też z pominięciem mongokonwertera, aby uniknąć klucza klasy, ale nadal nie działa. Może być bug na wiosnę. – hellojava

4

Od MongoDB oni polecają przechowywania Data od BSON Datownik jest do użytku wewnętrznego:

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

Różnica polega na tym, że data ma większy zakres reprezentacji, ponieważ jest to liczba całkowita 64-bitowa, która reprezentuje liczbę milisekund od czasów Unixa.

W BSON Znacznik czasu ma tylko 32 bity; pozostałe 32 bity są przyrostową liczbą całkowitą w ciągu sekundy, aby zapewnić wyjątkowość wartości. Przypuszczam, że to jest powód, dla którego używają znacznika czasu w oploku.

Jeśli nie przeszkadza wyjątkowość polecam użyć Data (aka ISODate), więc opcja 2 lub Opcja 3:

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

Czy pochodzi to z domyślnej biblioteki Java? "Nowa data()"? –