MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verschachtelte MongoDB-Java-Dokumente, auf die nicht mit Punkten im Schlüsselnamen zugegriffen werden kann

Die Punktnotation funktioniert gut, wenn sie innerhalb eines find verwendet wird Abfragefilter der Methode. Zum Beispiel

Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document);    // prints the returned document

oder sein mongo Shell-Äquivalent:

db.collection.find( { "one.two": "three" } )


Das Dokument get() der Klasse Methode nimmt ein Object (ein String-Schlüssel) als Parameter und gibt ein Object zurück .

Betrachten Sie den Code:

Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);

Die Ausgabe Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} zeigt, dass es drei gibt Schlüssel:_id , data-id und one . Beachten Sie, dass es nein gibt Schlüssel mit dem Namen one.two . Der Schlüssel two ist innerhalb des Unterdokuments des Dokuments mit dem Schlüssel one .

Also, aus Ihrem Code:

document.get("one.two");    // This is null ((Document)
document.get("one")).get("two"); // Not null

Die erste Anweisung gibt null zurück , und der nächste gibt three zurück (der String-Wert). Beides ist richtig Ergebnisse und das ist das Verhalten des Document Klassen-API.

Sie sollten die Methode getEmbedded verwenden um auf das eingebettete Feld one.two zuzugreifen . Ersetzen Sie also document.get("one.two") mit

document.getEmbedded(Arrays.asList("one", "two"), String.class)

Das Ergebnis ist wie erwartet "drei".