Punktnotationen fungerar bra när den används inom en find metodens frågefilter. Till exempel,
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
eller dess mongo skalmotsvarighet:
db.collection.find( { "one.two": "three" } )
Dokumentet
klassens get() metoden tar ett Object (en strängnyckel) som en parameter och returnerar ett Object .
Tänk på koden:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
Utdata Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} visar att det finns tre nycklar:_id , data-id och one . Observera att det finns nej nyckel som heter one.two . Nyckeln two är inom underdokumentet av dokumentet med nyckeln one .
Så från din kod:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
Den första satsen returnerar null , och nästa returnerar three (String-värdet). Båda är korrekta resultat och det är beteendet för Document klass API.
Du bör använda metoden getEmbedded för att komma åt det inbäddade fältet one.two . Så ersätt document.get("one.two") med
document.getEmbedded(Arrays.asList("one", "two"), String.class)
Resultatet är "tre", som förväntat.