如何在java中插入mongo db中的日期

时间:2015-09-01 20:28:18

标签: java mongodb datetime

有很多类似的问题要问。但与我面临的问题不完全相似。我几乎看到了围绕它的所有问题和答案

所以问题是

我必须在我的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()方法中单独传递毫秒而不是日期对象,那么它不会将此字段识别为日期并将其视为字符串,而是插入集合中

我需要2件事

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

3 个答案:

答案 0 :(得分:0)

JSON在数字字段和包含数字的文本字段之间产生差异。后者仅被识别为String;我认为这是你在认为自己以整数提供服务时所做的。很遗憾,您没有向我们展示相关代码。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

Date date = new Date();

BasicDBObject date= new BasicDBObject("date", date);
Data.insert(date);