Потратив некоторое время на чтение документации и другие вопросы о переполнении стека, я узнал, что использование точек в имени ключа (например, one.two для ключа) должно работать, но это не для меня.
Точечная запись работает нормально при использовании в фильтре запросов метода 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
(строковый ключ) в качестве параметра и возвращает 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)
Результат - «три», как и ожидалось.