MongoDB从BasicDBObject(Java)中提取值

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

例如,doc结构如下:

{ "_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的BasicDBObject)中提取“response.resData.domain:infData.domain:name”或其他类似嵌套值的值。 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"); 

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

没有办法像你正在使用Java驱动程序那样链接一个属性名称(肯定是get的,根据这个 , put也不应该工作)。

您需要像您建议的那样一次获取一个对象。

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

请参阅此处,了解可能使您的语法可能有效的未来function(尽管可能使用新的方法名称)。

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

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

我希望它有所帮助。