MongoDB Java вложенные документы недоступны с использованием точек в имени ключа - PullRequest
0 голосов
/ 10 апреля 2020

При использовании API MongoDB в Java я пытаюсь получить значение two в документе, который выглядит следующим образом:

data-id: "1234"
one:
    two: "three"

И я запускаю это:

MongoCollection<Document> documents = ...;
Document document = documents.find(Filters.eq("data-id", "1234")).first(); // Not null
document.get("one"); // Not null
document.get("one.two"); // This is null
((Document) document.get("one")).get("two"); // Not null

Потратив некоторое время на чтение документации и другие вопросы о переполнении стека, я узнал, что использование точек в имени ключа (например, one.two для ключа) должно работать, но это не для меня.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Потратив некоторое время на чтение документации и другие вопросы о переполнении стека, я узнал, что использование точек в имени ключа (например, 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)

Результат - «три», как и ожидалось.

0 голосов
/ 11 апреля 2020

MongoDB допускает точки в именах полей.

document.get("one.two");

на самом деле будет искать поле типа

data-id: "1234"
"one.two": "three"

, где "one.two" - простое поле, а не встроенный документ.

...