尝试从Mongo读取数组并将其放入Java对象中

时间:2013-05-22 18:49:21

标签: java list mongodb

我在Mongo中有一个数组,我想把它放到一个列表中。

这就是我所拥有的

BasicDBList computerList = new BasicDBList(); 
        if (dbObj.get("computers") != null){
            computerList =  (BasicDBList) dbObj.get("computers");
        }
        for (Object obj : computerList) { 
            System.getComputers().add((Computer) obj);
        }

我有一个主System对象,里面有一个List,我在这里正在尝试从Mongo中检索computers并重新投入到dataObject中。

我收到错误

Caused by: java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to com.me.systems.commons.entities.Computer

关于我能做什么的任何想法?

编辑: 我确实对对象的名称进行了模糊处理,但我仔细检查了它们,并且它们与语法一致且准确。

1 个答案:

答案 0 :(得分:1)

我假设您的变量dbObj是从MongoDB检索到的DBObject,我还假设在示例代码的第6行抛出了ClassCastException。

问题是您在代码示例中的第6行进行了转换,并且您正在转换为错误的类型。当你从MongoDB获得一些东西时,你不会得到你的Java对象(即计算机)。数据库中的任何文档或子文档都将作为BasicDBObject返回。这不能投射到计算机上。

您需要做的是从BasicDBObject中获取相关信息,然后从中创建一台新计算机。所以,例如你的计算机看起来像这样:

class Computer {
    String name;
    int ipAddress;

    Computer(final String name, final int ipAddress) {
        this.name = name;
        this.ipAddress = ipAddress;
    }
}

然后你可能会想做类似的事情:

final BasicDBObject dbObj = null;
if (dbObj.get("computers") != null){
    computerList =  (BasicDBList) dbObj.get("computers");
}
for ( obj : computerList) {
    final BasicDBObject computerAsDBObject = (BasicDBObject) obj;
    final Computer computer = new Computer(computerAsDBObject.getString("name"), 
                                           computerAsDBObject.getInt("ipAddress"));
    System.getComputers().add(computer);
}

当您直接使用Java驱动程序时,您将只从数据库中获取一组非常有限的类型 - 即字符串,整数,长整数和其他基元,以及简单对象,如BasicDBList和BasicDBObject。

Abhishek在评论中提到的是,如果你使用像Morphia或Spring Data这样的ODM,你将从Mongo获得像你的计算机类这样的“真正的”Java对象,但你不会得到驱动程序单独