我在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!
答案 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值而不是子文档是完全无效和错误的。