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.