【问题标题】:How to save Timestamp type value in MongoDb | Java如何在 MongoDb 中保存时间戳类型值 |爪哇
【发布时间】:2015-01-12 05:42:22
【问题描述】:

从 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")}

【问题讨论】:

    标签: java mongodb spring-data-mongodb bson


    【解决方案1】:

    我将以下内容与默认的 mongodb-java-driver 一起使用(没有 spring 数据)。

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

    而 MongoDB 的查找结果是:

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

    所以BSONTimeStamp 到类名和类属性的序列化以及它们的值取决于 spring-data-mongodb 序列化程序。您应该使用默认的 java-mongodb-driver 或在 MongoDB 中使用 Java DateISODate 格式。

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

    【讨论】:

    • 你是绝对正确的。我也尝试了同样的方法,它适用于普通的 mongodb-java-driver。但不是春天。我还尝试覆盖 mongoconverter 以避免 _class 键,但它仍然不起作用。可能是 Spring 中的一个错误。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 这是来自 Java 默认库吗? “新日期()”?
    • 是的,来自 java.util.Date 的日期;
    猜你喜欢
    • 2012-10-18
    • 2018-05-01
    • 2019-07-19
    • 2011-11-21
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多