如何在MongoDb中保存时间戳类型值Java的

时间:2015-01-12 05:42:23

标签: java mongodb spring-data-mongodb bson

从Java驱动程序,我想保存一个类似于MongoDb中的json的文档

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

我试过的选项。

选项1: Map doc = new HashMap(1);

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

导致以下不需要的格式

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

选项2:

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

导致:

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

2 个答案:

答案 0 :(得分:4)

我使用以下默认的mongodb-java-driver(没有弹簧数据)。

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

查找的MongoDB结果是:

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

因此BSONTimeStamp序列化为classname和Class属性的值取决于spring-data-mongodb序列化程序。您应该使用默认的java-mongodb-driver或在MongoDB中使用Java DateISODate格式。

或者您可以扩展spring-data-mongodb序列化程序并为类BSONTimeStamp编写自己的序列化程序和反序列化程序以使用MongoDB时间戳类型。

答案 1 :(得分:4)

从MongoDB开始,他们建议存储日期,因为BSON时间戳是供内部使用的:

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

不同之处在于Date具有更多的表示范围,因为它是一个64位整数,表示自Unix纪元以来的毫秒数。

在BSON时间戳中,只有32位才有此目的;其他32位是一秒内的增量序数整数,以确保值的唯一性。我想这就是他们在oplog中使用Timestamp的原因。

如果你不介意唯一性,我建议使用日期(又名ISODate),所以选项2或选项3:

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