2014-07-24 106 views
2

我使用org.springframework.data.mongodb.core.MongoTemplate將數據保存到MongoDB。我的樣品數據如下:Spring將日期保存爲MongoDB中的字符串 - 無法從類型字符串轉換爲類型日期

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"); 

這是我在蒙戈得到:

{ 
    "_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 加載豆,我得到

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

你在這裏做的是打破一個普遍的「哈希」結構的基本規則,它存在於Java以外的任何地方。這裏的基本概念是,哈希或映射的「鍵」只能是字符串而不是特定類型。

MongoDB使用BSON,它是從JSON規範派生的「二進制」和「類型」形式。遵循一般的JSON語義,BSON文檔必須是的「密鑰」是字符串,而不是任何其他特定類型。

這至少是MongoDB如何執行它的。所以這裏的一般經驗法則是不要將其他類型放在字符串以外的Map的鍵中。

無論如何,這實際上並不是很好的做法,因爲「數據」作爲關鍵一般是壞消息。你最好表現爲一個數組,像這樣:

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

這些是容易的MongoDB在查詢過程中沒有使用客戶端處理或JavaScript中的MapReduce。對於一般的MongoDB查詢,Map類型結構需要用絕對路徑來表示它們的鍵。

所以1.不要使用其他類型的鍵而不是字符串,它們將被字符串化。 2.不要使用數據作爲鍵,而是使用數組。

相關問題