1

我在 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对象,其中有一个列表,这就是我在这里所做的尝试computers从 Mongo 中检索并返回到 dataObject 中。

我收到错误

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

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

编辑:我确实混淆了对象的名称,但我仔细检查了它们与语法一致且准确。

4

1 回答 1

2

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

问题是您在代码示例中的第 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 对象,例如您的 Computer 类,但仅靠驱动程序是无法获得的。

于 2013-05-28T12:54:32.383 回答