7

我无法从 MongoDB 中的查询文档中检索值。

例如,文档结构如下:

    {
        "_id": {
            "$oid": "50f93b74f9eccc540b302462"
        },
       "response": {
            "result": {
                "code": "1000",
                "msg": "Command completed successfully"
            },
            "resData": {
                "domain:infData": {
                    "domain:name": "ritesh.com",
                    "domain:crDate": "2007-06-15T12:02:36.0000Z",
                    "domain:exDate": "2013-06-15T12:02:36.0000Z"
                }
            }
        }
    }

查询代码是:

    DBCollection collection = db.getCollection("domains");

    BasicDBObject p = new BasicDBObject("response.resData.domain:infData.domain:name", "ritesh.com");
    DBCursor c = collection.find(p);

    while(c.hasNext()) {
        DBObject obj = c.next();
        Object value = obj.get("response.resData.domain:infData.domain:name");
    }

它可以很好地查询并获取文档,但我似乎无法弄清楚如何从 DBObject(或自 c. next() 返回类型 BasicDBObject)。

我可以一次获取一个对象,例如:

    ((DBObject)obj.get("response")).get("resData")....

但这似乎很麻烦。

我想既然你可以在 BasicDBObject 中放置()一个嵌套字段值,例如:

    basicDBObject.put("response.resData.domain:infData.domain:name", "ritesh.com");

我可以类似地使用 get() 使用相同类型的键从 BasicDBObject 结果中获取。就像我试图在上面的代码中做的那样:

    Object value = obj.get("response.resData.domain:infData.domain:name");

但那是返回一个空值。

这可能很简单,但我似乎无法弄清楚。而且我在网上检查过的所有示例都只从结果中获取未嵌套的值。喜欢

    doc.get("name");

而不是类似的东西:

    doc.get("name.lastname.clanname");

任何帮助,将不胜感激。谢谢!

4

2 回答 2

12

没有办法像使用 Java 驱动程序那样链接属性名称(gets 肯定,并且根据thisput也不应该工作)。

您需要按照您的建议一次获取一个对象。

((DBObject)obj.get("response")).get("resData")

请参阅此处以了解可能使您的语法可能工作的潜在未来功能(尽管可能使用新方法名称)。

于 2013-01-19T02:57:10.660 回答
8

我遇到了同样的问题,我写了一个小函数来获取链式属性。

private Object getFieldFromCursor(DBObject o, String fieldName) {

    final String[] fieldParts = StringUtils.split(fieldName, '.');

    int i = 1;
    Object val = o.get(fieldParts[0]);

    while(i < fieldParts.length && val instanceof DBObject) {
        val = ((DBObject)val).get(fieldParts[i]);
        i++;
    }

    return val;
}

我希望它有所帮助。

于 2013-11-12T11:54:15.943 回答