2013-01-19 41 views
6

我在从MongoDB中的查询文档中检索值时遇到问题。MongoDB从BasicDBObject中提取值(Java)

例如,文档结构是这样的:

{ 
     "_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(或BasicDBObject自c.next()返回类型BasicDBObject)提取“response.resData.domain:infData.domain:name”或其他类似嵌套值的值。

我可以在一个时间一个获取对象,如:

((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"); 

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

回答

11

没有办法像使用Java驱动程序一样链接属性名称(当然,get s,根据thisput也不应该工作)。

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

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

为未来潜在的功能,将让你的语法可能工作(尽管可能用新的方法名)见here

6

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

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; 
} 

我希望它有帮助。

+1

你可以使用'fieldName.split(“\\。”)'不依赖于StringUtils – Esteve