【发布时间】: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字段替换为时间戳?