Точковата нотация работи добре, когато се използва в рамките на find филтър за заявка на метода. Например,
Document document = collection.find(Filters.eq("one.two", "three")).first();
System.out.println(document); // prints the returned document
или неговия mongo еквивалент на обвивката:
db.collection.find( { "one.two": "three" } )
Документ
get() на класа методът приема Object (ключ String) като параметър и връща Object .
Помислете за кода:
Document doc = coll.find(eq("data-id", "1234")).first();
System.out.println(doc);
Изходът Document{{_id=1.0, data-id=1234, one=Document{{two=three}}}} показва, че са три ключове:_id , data-id и one . Имайте предвид, че не ключ с име като one.two . Ключът two е в поддокумента на документа с ключа one .
И така, от вашия код:
document.get("one.two"); // This is null ((Document)
document.get("one")).get("two"); // Not null
Първият израз връща null , а следващият връща three (стойността на низа). И двете са правилни резултати и това е поведението на Document клас API.
Трябва да използвате метода getEmbedded за достъп до вграденото поле one.two . Така че, заменете document.get("one.two") с
document.getEmbedded(Arrays.asList("one", "two"), String.class)
Резултатът е "три", както се и очакваше.