2013-01-19 3 views
6

Ho problemi a recuperare i valori dai documenti richiesti in MongoDB.MongoDB estrazione di valori da BasicDBObject (Java)

Ad esempio, la struttura è come 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" 
       } 
      } 
     } 
    } 

E il codice di query è:

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

Interroga bene e recupera il doc, ma io non riesco a capire come estrarre il valore di "response.resData.domain: infData.domain: name" o altri valori simili nidificati dal DBObject (o BasicDBObject poiché c.next() restituisce il tipo BasicDBObject).

ho potuto prendere gli oggetti uno alla volta come:

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

ma che sembra molto ingombrante.

ho pensato da quando si può mettere() un valore di campo nidificato in BasicDBObject come:

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

che ho potuto allo stesso modo utilizzare Get() per recuperare dal risultato BasicDBObject utilizzando lo stesso tipo di chiave. Come ho tentato di fare nel codice sopra con:

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

Ma questo sta restituendo un valore nullo.

Probabilmente è qualcosa di semplice, ma non riesco a capirlo. E ovunque ho controllato in rete, gli esempi recuperano solo valori che non sono nidificati, dal risultato. Come

doc.get("name"); 

invece di qualcosa di simile:

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

Qualsiasi aiuto sarebbe apprezzato. Grazie!

risposta

11

Non esiste un modo per concatenare un nome di proprietà come si sta facendo utilizzando il driver Java (get s di sicuro, e in base allo this, non si suppone che lo sia anche lo put).

Avrete bisogno di ottenere gli oggetti uno alla volta come suggerito.

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

Vedi here per una caratteristica potenziale futuro che permetterebbe la sintassi di lavorare possibilmente (anche se, probabilmente con un nuovo nome di metodo).

6

Mi sono imbattuto nello stesso problema e ho scritto una piccola funzione per recuperare le proprietà concatenate.

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

Spero che sia d'aiuto.

+1

È possibile utilizzare 'fieldName.split (" \\. ")' Per non dipendere da StringUtils – Esteve