如何使用java在mongoDB中保存和读取地图

时间:2014-06-10 08:17:09

标签: java mongodb map

我在mongo中有一个包含3列的集合,如下所示:

{ 
"_id" : { "$oid" : "5396ad5de4b09ea27a641ed6"} , 
"word" : "test_word" , 
"doc_occurrence" : "'total':25,'sport':10" ,
 "total_occurrence" : "'total':32,'sport':15"
}

doc_occurrence和total_occurrence是Map。我以这种方式将文档插入到集合中:

        private boolean add(String word, Map<String, Integer> docOccurrence, Map<String, Integer> totalOccurrence) {
    BasicDBObject document = new BasicDBObject();
    document.put("word", word);
    document.put("docOccurrence", docOccurrence);
    document.put("totalOccurrence", totalOccurrence);
    try {
        synchronized (LOCK_WRITE) {
            table.insert(WriteConcern.SAFE,document);


        }
    } catch (MongoException e) {
        logger.error("Could not insert new row to word_cat : {}", e.getMessage());
        return false;
    }
    return true;
}

我想以这种方式从DB读取地图:

        BasicDBObject searchQuery = new BasicDBObject();
        searchQuery.put("word",word);
    try {
        DBCursor cursor = table.find(searchQuery);
        if (cursor.hasNext()) {
            DBObject doc = cursor.next();
            Map<String, Integer> map = (Map<String, Integer>)doc.get("docOccurrence"); // ClassCastException

但是我得到了

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map

我有没有办法直接从数据库中读取地图?如果没有,什么是altenative?

p.s:BSON将地图转换为字符串。实际上BSON密钥必须是String!

2 个答案:

答案 0 :(得分:1)

这里的问题是你创建了你的BSON对象,Map部分放在&#34;字符串&#34;构造函数的大小,因此有一个隐含的&#34; stringify&#34;在这个调用中。

作为BSON Object构造函数的唯一参数包装,然后Map正确序列化:

document.put("word", word);
document.put("docOccurrence", new BasicDBObject(docOccurrence));
document.put("totalOccurrence", new BasicDBObject(totalOccurrence));

BasicDBObject类实现了AbstractMap接口,并且应该能够以这种方式用于读取的数据。其余的代码应该按预期工作。

答案 1 :(得分:1)

我建议您阅读有关MongoDB和NoSQL的更多信息,因为您似乎对整个概念感到困惑。

您在mongodb中有一个集合,其文档有3个字段,不包括_id。您的 doc_occurrence total_occurrence 字段的值应为** subdocument ** s(另一个json对象),即MongoDB的滚动方式。您使用字符串csv值而不是子文档是完全无效和错误的。