我有一个如下所示的集合:
db.testdata.save(
{
"Indicator": "One",
"secs": [
{
"when": "2013-03-16",
"num": 16,
"choices": [
{
"size": "10",
"mult": "10"
},
{
"size": "10",
"mult": "10"
}
]
},
{
"when": "2013-03-22",
"num": 24,
"choices": [
{
"size": "100",
"mult": "100"
},
{
"size": "100",
"mult": "100"
}
]
}
]
})
我正在尝试使用自定义对象检索它,如下所示:
public class Test {
public static void main(String args[]) throws UnknownHostException {
Mongo mongo = new Mongo();
DB db = mongo.getDB("at");
DBCollection testdata = db.getCollection("testdata");
BasicDBObject query = new BasicDBObject();
query.put("Indicator", "One");
CustomChainData ocd = (CustomChainData) testdata.findOne(query);
ocd.getWhen().size();
}
}
import java.util.List;
import com.mongodb.BasicDBObject;
public class CustomChainData extends BasicDBObject{
public CustomChainData() {
super();
}
@SuppressWarnings("unchecked")
public List<WhenData> getWhen() {
return (List<WhenData>) get("secs");
}
public void setWhen(List<WhenData> expirationDts) {
put("secs", expirationDts);
}
}
import com.mongodb.BasicDBObject;
public class WhenData extends BasicDBObject{
public String getSize() {
return (String) get("size");
}
public void setSize(String size) {
put("size", size);
}
}
不幸的是我继续得到:
线程中的异常&#34; main&#34; java.lang.ClassCastException:com.mongodb.BasicDBObject无法强制转换为Test.main中的com.CustomChainData(Test.java:19)
答案 0 :(得分:6)
MongoDB Java驱动程序不支持自动使用BasicDBObject
的子类。这就是你获得ClassCastException
的原因;驱动程序返回的对象是BasicDBObject
个实例,而不是子类的实例。
使这个工作的一个选择是用构造函数调用替换强制转换。例如,在Test
中,替换
CustomChainData ocd = (CustomChainData) testdata.findOne(query);
与
CustomChainData ocd = new CustomChainData(testdata.findOne(query));
并在CustomChainData
中添加
CustomChainData(Map m) {
super(m);
}
这使用了一个拷贝构造函数来允许你的CustomChainData
类使用从MongoDB加载的数据。但是,每次返回BasicDBObject
时,您都需要应用此模式(例如,对于When对象)。
我更喜欢使用在MongoDB数据和Java对象之间执行映射的库的方法。我过去曾使用过Morphia,对此非常满意。其他选项列在MongoDB Java Language Center。
中答案 1 :(得分:0)
您需要设置对象类类型....在保存和检索对象之前使用setObjectClass DBCollection方法....在您的情况下,它应该是 -
DBCollection testdata = db.getCollection(&#34; testdata&#34;); testdata.setObjectClass(CustomChainData.class); 强>