2012-08-28 6 views
5

Ich versuche, den Wert eines Schlüssels aus einem Unterdokument zu erhalten, und ich kann nicht herausfinden, wie die BasicDBObject.get() -Funktion zu verwenden, da der Schlüssel zwei eingebettet ist Ebenen tief. Hier ist die Struktur des DokumentsJava MongoDB erhält Wert für Unterdokument

File { 
    name: file_1 
    report: { 
     name: report_1, 
     group: RnD 
    } 
} 

Im Grunde eine Datei hat mehrere Berichte und ich brauche, um die Namen aller Berichte in einer bestimmten Datei abgerufen werden. Ich bin in der Lage zu tun BasicDBObject.get("name") und ich kann den Wert "file_1", aber wie mache ich so etwas BasicDBObject.get("report.name")? Ich habe das versucht, aber es hat nicht funktioniert.

+0

Wenn Sie sagen, dass es nicht funktionierte, was wirklich geschah? – Mark

+0

Wenn es nicht funktionierte, gab es nichts zurück. – Dhruv

Antwort

10

Sie sollten zuerst das "Bericht" -Objekt abrufen und dann auf seinen Inhalt zugreifen. Sie können den Beispielcode unten sehen.

DBCursor cur = coll.find(); 

for (DBObject doc : cur) { 
    String fileName = (String) doc.get("name"); 
    System.out.println(fileName); 

    DBObject report = (BasicDBObject) doc.get("report"); 
    String reportName = (String) report.get("name"); 
    System.out.println(reportName); 
} 
+0

Wird dies ausprobieren. Vielen Dank. – Dhruv

+0

Wie kann es mit Jongo API gemacht werden? –

3

ich einen zweiten Weg, es zu tun gefunden, auf einem anderen Beitrag (knapp über den Link speichern sonst würde ich das aufgenommen haben).

(BasicDBObject)(query.get("report")).getString("name") 

wo query = (BasicDBObject) cursor.next()

+1

Das ist das gleiche wie ich geschrieben habe. Anstelle von zwei Zeilen haben sie Abfrage in Einzellinie geschrieben. –

1

du versuchen können, das für mich gearbeitet

BasicDBObject query = new BasicDBObject("report.name", "some value");

+0

Für die Abfrage von Feldern in Filialdokumenten funktionierte die Verwendung dieser Punktnotation perfekt für mich. Vielen Dank. – splungebob

1

Sie auch Abfragen verwenden können, wie im Fall von MongoTemplate und so weiter ...

Query query = new Query(Criteria.where("report.name").is("some value"));