Точковата нотация работи добре, когато се използва в рамките на 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)
Резултатът е "три", както се и очакваше.