Notacja z kropkami działa dobrze, gdy jest używana w find filtr zapytań metody. Na przykład
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
lub jego mongo odpowiednik powłoki:
db.collection.find( { "one.two": "three" } )
Dokument
get() klasy metoda przyjmuje Object (klawisz String) jako parametr i zwraca Object .
Rozważ kod:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
Wynik Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} pokazuje, że są trzy klucze:_id , data-id i one . Zauważ, że nie klucz o nazwie one.two . Klucz two jest w ramach dokumentu podrzędnego dokumentu z klawiszem one .
Tak więc z twojego kodu:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
Pierwsza instrukcja zwraca null , a następny zwraca three (wartość ciągu). Oba są poprawne wyniki i to jest zachowanie Document API klasy.
Powinieneś użyć metody getEmbedded aby uzyskać dostęp do osadzonego pola one.two . Zastąp więc document.get("one.two") z
document.getEmbedded(Arrays.asList("one", "two"), String.class)
Wynik to „trzy”, zgodnie z oczekiwaniami.