2013-01-19 7 views
6

Mam problemy z odczytaniem wartości z zapytanych dokumentów w MongoDB.MongoDB pobiera wartości z BasicDBObject (Java)

Na przykład, struktura doc jest jak:

{ 
     "_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" 
       } 
      } 
     } 
    } 

I kod zapytania to:

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

Pyta porządku i pobiera doc, ale nie wydają się dowiedzieć jak wyodrębnić wartość "response.resData.domain: infData.domain: name" lub inne podobnie zagnieżdżone wartości z DBObject (lub BasicDBObject ponieważ c.next() zwraca typ BasicDBObject).

mogę pobrać obiektów jednym na raz jak:

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

ale to wydaje się być bardzo kłopotliwe.

Myślałem, ponieważ można umieścić() zagnieżdżony wartość pola w BasicDBObject jak:

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

że mogę używać podobnie get(), aby pobrać od wyniku BasicDBObject stosując ten sam rodzaj klucza. Jak próbowałem zrobić w powyższym kodzie:

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

Ale to zwraca wartość zerową.

To prawdopodobnie coś prostego, ale nie mogę tego zrozumieć. I wszędzie, gdzie sprawdziłem w sieci przykłady pobierają tylko wartości, które nie są zagnieżdżone, od wyniku. Jak

doc.get("name"); 

zamiast coś takiego:

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

Każda pomoc będzie mile widziane. Dzięki!

Odpowiedz

11

Nie można połączyć nazwy właściwości, tak jak w przypadku używania sterownika Java (get s, a zgodnie z this, put również nie działa).

Będziesz musiał pobrać obiekty pojedynczo zgodnie z sugestiami.

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

Zobacz here dla potencjalnej przyszłej funkcji, która pozwoliłaby składnia do możliwie działa (choć prawdopodobnie z nową nazwą metody).

6

Wpadłem na ten sam problem i napisałem małą funkcję do pobierania przykutych właściwości.

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

Mam nadzieję, że pomoże.

+1

Można użyć 'fieldName.split (" \\. ")', Aby nie polegać na StringUtils – Esteve

Powiązane problemy