我使用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?
我做错了吗?
答案 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. 。不要将数据用作键,而是使用数组。