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".