Spring将日期保存为MongoDB中的字符串 - 无法从类型String转换为Date类型

时间:2014-07-24 09:10:09

标签: java json spring mongodb

我使用org.springframework.data.mongodb.core.MongoTemplate将数据保存到MongoDB。我的示例数据是关注bean:

public class SampleBean{
    private Date date;
    private List<Date>  datesList;
    private TreeMap<Date, Integer> datesMap;
    // setters and getters
}

我按照说明打电话。

SampleBean bean = new SampleBean();
MongoTemplate mongo = new MongoTemplate();

List<Date> dateList = new ArrayList<Date>();
dateList.add(new Date());
TreeMap<Date,Integer> dateMap = new TreeMap<Date, Integer>();
dateMap.put(new Date(), new Integer(1));

bean.setDate(new Date());
bean.setDateList(dateList);
bean.setDateMap(dateMap);

mongo.save(bean, "SampleBean");

这就是我在mongo中得到的:

{
    "_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
    }
}

由于存储的方式,我无法从MongoDB加载bean  我得到了

 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

为什么TreeMap中的日期不存储为ISODate?

我做错了吗?

1 个答案:

答案 0 :(得分:1)

你在这里做的是打破存在于Java之外的其他地方的一般“哈希”结构的基本规则。这里的基本概念是Hash或Map的“键”只能是字符串而不是特定类型。

MongoDB使用BSON,它是从JSON规范派生的“二进制”和“类型”形式。符合一般JSON语义,BSON文档的“键”必须为字符串,而不是任何其他特定类型。

至少这是MongoDB如何执行它。所以这里的一般经验法则是不要将其他类型放在除字符串之外的Map的键中。

这无论如何都不是好习惯,因为“数据”作为关键通常是坏消息。最好以数组形式呈现,如下:

"dates": [
    { "date": ISODate("2014-07-23T21:28:14.876Z"), "count": 1 }
]

MongoDB可以更轻松地在查询中处理,而无需使用MapReduce中的客户端处理或JavaScript。对于一般的MongoDB查询,Map类型结构需要用其键的绝对路径表示。

所以 1。不要将其他类型用于键而不是字符串,无论如何它们都会被字符串化。 2. 。不要将数据用作键,而是使用数组。