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

How to save Timestamp type value in MongoDb | Java

来自 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")}

我使用以下默认 mongodb-java-驱动程序(没有 spring 数据)。

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

查找的 MongoDB 结果是:

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

因此 BSONTimeStamp 到类名​​的序列化和 Class 属性及其值取决于 spring-data-mongodb 序列化程序。您应该使用默认的 java-mongodb-驱动程序或使用 Java Date 和 MongoDB.

中的 ISODate 格式

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

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

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

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

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

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

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