有很多类似的问题要问。但与我面临的问题不完全相似。我几乎看到了围绕它的所有问题和答案
所以问题是
我必须在我的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能够认识到它是一个日期字段
答案 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);