2013-01-19 71 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