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