【问题标题】:How to insert date in mongo db from java如何从 java 在 mongo db 中插入日期
【发布时间】:2015-09-01 20:28:17
【问题描述】:

有很多类似的问题被问到。但与我面临的问题并不完全相似。几乎所有的问题和答案我都看过了

所以问题是

我必须在我的 mongo 集合中插入一个日期字段

但我无法直接访问该集合。我必须使用一项服务。该服务接受一个字符串并返回 oid。

因此,一旦我构造了 BasicDBObject,我就会在其上调用 toString 并将其传递给我的服务。我什至尝试将它直接插入到测试集合中,但 mongo 正在抱怨。

 BasicDBObject document = new BasicDBObject(); 
    long createdAtSinceEpoch = 0;
    long expiresAtSinceEpoch = 0;

    createdAtSinceEpoch = System.nanoTime();
    Date createdAt = new Date(TimeUnit.NANOSECONDS.toMillis(createdAtSinceEpoch));
    document.append("createdAt", createdAt);

    expiresAtSinceEpoch = createdAtSinceEpoch + +TimeUnit.SECONDS.toNanos(30);
    Date expiresAt = new Date(TimeUnit.NANOSECONDS.toMillis(expiresAtSinceEpoch));
document.append("expiresAt", expiresAt);
service.storeRecord(document.toString());

生成的 JSON 字符串看起来像

{
"createdAt": {
    "$date": "2015-09-01T20:05:21.641Z"
},
"expiresAt": {
    "$date": "2015-09-01T20:05:51.641Z"
}

Mongo 抱怨说

Unable to parse JSON : Date expecting integer milliseconds, at (3,17)

所以如果我在 document.append() 方法中单独传递毫秒而不是日期对象,那么它不会将此字段识别为日期并将其视为字符串,但会插入到集合中

我需要两样东西

1) 我要插入数据 2)我计划通过向 expiresAt 字段添加索引来使该行过期。所以我想让 mongo 认识到它是一个日期字段

【问题讨论】:

  • 创建您想要的确切 JSON 对象,而不经过 BasicDBObject?还是解析 JSON 序列化并将任何 $date 字段替换为时间戳?

标签: java mongodb datetime


【解决方案1】:

JSON 在数字字段和包含数字的文本字段之间有所不同。后者只被识别为String;我假设这就是您认为您将日期作为整数提供给您的服务时所做的事情。很遗憾,您没有向我们展示相关代码。

【讨论】:

    【解决方案2】:

    当我将日期信息保存为非字符串格式时,我在我的 DTO 中注释该字段,如下所示。这有助于 MongoDB 知道该字段将被视为 ISO 日期,这对于进行范围搜索等很有用,

    @DateTimeFormat(iso = ISO.DATE_TIME) private Date date;
    

    【讨论】:

      【解决方案3】:
      Date date = new Date();
      
      BasicDBObject date= new BasicDBObject("date", date);
      Data.insert(date);
      

      【讨论】:

        猜你喜欢
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 2014-08-20
        相关资源
        最近更新 更多