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 }
]