Reputation: 5064
From Java driver, I want to save a document that looks like below json in MongoDb
{ "ts" : Timestamp(1421006159, 4)}
Options I tried.
Option 1: Map doc= new HashMap(1);
doc.put("ts", new BSONTimeStamp());
It results in the below not required format
{"ts" : {
"_inc" : 0,
"_class" : "org.bson.types.BSONTimestamp"
}}
Option 2:
doc.put("ts",new Timestamp(new Date().getTime()));
it results in :
{"ts" : ISODate("2015-01-12T05:36:43.343Z")}
Upvotes: 10
Views: 26772
Reputation: 196
From MongoDB they recommend storing a Date since BSON Timestamp is for internal use:
http://docs.mongodb.org/manual/reference/bson-types/#timestamps
The difference is that Date has more representation range since is a 64-bit integer that represents the number of milliseconds since Unix epoch.
In BSON Timestamp only 32 bits have this purpose; the other 32 bits are an incremental ordinal integer within a second to assure uniqueness of the value. I suppose this is the reason why they use Timestamp in oplog.
If you don't mind uniqueness I recommend to use a Date (aka ISODate), so option 2 or option 3:
doc.put("ts", new Date());
Upvotes: 4
Reputation: 20112
I used the following with the default mongodb-java-driver (no spring data).
DBObject doc= new BasicDBObject();
doc.put("ts", new BSONTimeStamp(1421006159, 4));
And the MongoDB result for a find is:
{ "_id" : ObjectId("54b396da7fe45ee2d6c5e03a"), "ts" : Timestamp(1421006159, 4) }
So the Serialisation of BSONTimeStamp
to the classname and the Class attributes an their values depends on the spring-data-mongodb serializer. You should use the default java-mongodb-driver or use Java Date
and the ISODate
Format in MongoDB.
Or Maybe you could extend the spring-data-mongodb serializer and Write your own serializer and deserializer for the Class BSONTimeStamp
to use the MongoDB Timestamp type.
Upvotes: 6