2013-01-19 12 views
6

Ich habe Probleme, Werte von den abgefragten Dokumenten in MongoDB abgerufen werden.MongoDB Extrahieren von Werten aus BasicDBObject (Java)

Zum Beispiel kann die doc-Struktur ist wie:

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

Und der Abfrage-Code ist:

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

Es fragt fein und holt den doc, aber ich kann nicht scheinen, um herauszufinden wie extrahiert man den Wert von "response.resData.domain: infData.domain: name" oder andere ähnlich verschachtelte Werte aus dem DBObject (oder BasicDBObject seit c.next() gibt Typ BasicDBObject zurück).

Ich kann die Objekte einen nach dem anderen holen wie:

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

aber das scheint sehr umständlich.

Ich dachte, da Sie() einen verschachtelten Feldwert in BasicDBObject wie setzen können:

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

, dass ich in ähnlicher Weise() aus dem BasicDBObject Ergebnis zu holen bekommen konnte verwenden, um die gleiche Art von Schlüssel. Wie ich in dem obigen Code versucht habe mit:

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

Aber das ist ein Nullwert zurückgeben.

Es ist wahrscheinlich etwas unkompliziert, aber ich kann es nicht herausfinden. Und überall, wo ich im Netz nachgesehen habe, holen die Beispiele nur Werte, die nicht verschachtelt sind, aus dem Ergebnis. Wie

doc.get("name"); 

statt so etwas wie:

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

Jede mögliche Hilfe würde geschätzt. Vielen Dank!

Antwort

11

keine Möglichkeit zu Kette Es gibt einen Eigenschaftsnamen wie Sie mit den Java-Treiber zu tun (get s sicher und nach den this wird put eigentlich nicht funktionieren).

Sie müssen die Objekte einer nach dem anderen zu bekommen, wie Sie vorgeschlagen.

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

Siehe here für eine mögliche zukünftige Funktion, die Syntax möglicherweise erlauben würde, zu arbeiten (obwohl, wahrscheinlich mit einem neuen Methodennamen).

6

Ich lief das gleiche Problem und schrieb eine kleine Funktion, um verkettete Eigenschaften zu holen.

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

Ich hoffe, es hilft.

+1

Sie könnten 'fieldName.split (" \\. ")' Verwenden, um nicht von StringUtils abhängig zu sein – Esteve

Verwandte Themen