Java Spring在MongoDB中将日期另存为字符串-无法从类型字符串转换为类型日期
我使用Java Spring在MongoDB中将日期另存为字符串-无法从类型字符串转换为类型日期,java,json,spring,mongodb,Java,Json,Spring,Mongodb,我使用org.springframework.data.mongodb.core.MongoTemplate将数据保存到mongodb。我的示例数据如下所示: public class SampleBean{ private Date date; private List<Date> datesList; private TreeMap<Date, Integer> datesMap; // setters and getters }
org.springframework.data.mongodb.core.MongoTemplate
将数据保存到mongodb
。我的示例数据如下所示:
public class SampleBean{
private Date date;
private List<Date> datesList;
private TreeMap<Date, Integer> datesMap;
// setters and getters
}
由于它的存储方式,我无法从MongoDB
我明白了
为什么树映射中的日期不存储为ISODate?
我做错了什么吗?您在这里所做的是打破了Java之外任何地方都存在的一般“哈希”结构的基本规则。这里的基本概念是散列或映射的“键”只能是字符串,而不能是特定类型 MongoDB使用BSON,它是从JSON规范派生的“二进制”和“类型化”形式。符合一般JSON语义,BSON文档的“键”必须是字符串,而不是任何其他特定类型 这至少是MongoDB执行它的方式。因此,这里的一般经验法则是,除了字符串之外,不要在映射的键中放置其他类型 无论如何,这确实不是一个好的做法,因为“数据”作为一个键通常是坏消息。最好以数组的形式呈现,如下所示:
"dates": [
{ "date": ISODate("2014-07-23T21:28:14.876Z"), "count": 1 }
]
MongoDB在查询中更容易处理这些问题,而无需像MapReduce那样使用客户端处理或JavaScript。对于一般的MongoDB查询,映射类型结构需要用指向其键的绝对路径表示
因此1。不要对字符串以外的键使用其他类型,它们将被字符串化2。不要使用数据作为键,而是使用数组。“存在于Java之外的任何地方”是一种非常以MongoDB为中心的看待世界的方式,肯定忽略了大多数通用编程语言中可用的哈希函数的现实
{
"_id" : ObjectId("53d028eeb71a1523582b1b1c"),
"_class" : "example.SampleBean",
"date" : ISODate("2014-07-23T21:28:14.869Z"),
"datesList" : [
ISODate("2014-07-23T21:28:14.876Z")
],
"datesMap" : {
"Wed Jul 23 23:28:14 CEST 2014" : 1
}
}
Handler execution resulted in exception - forwarding to resolved error view
org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value 'Wed Jul 23 23:28:14 CEST 2014'; nested exception is java.lang.IllegalArgumentException
"dates": [
{ "date": ISODate("2014-07-23T21:28:14.876Z"), "count": 1 }
]