Извлекать данные из mon go db в приложении весенней загрузки, где имя коллекции и поля для извлечения известны во время выполнения - PullRequest
0 голосов
/ 03 апреля 2020

Мне нужно создать пакетное задание с пружинной загрузкой, в котором мне нужно получить данные из mongoDB, где у меня нет информации об имени и полях коллекции для выборки во время кодирования. Я получаю эту информацию только тогда, когда начинается партия. Например, когда запускается пакет, я могу прочитать файл свойств, где я получаю имя коллекции по 1 свойству, а другое свойство дает список полей для извлечения, третье поле предоставляет критерии / условия для запроса. Поэтому из-за этого у меня не может быть Java POJO определены, которые имеют отображение для коллекции, или я не могу создать любой MongoRepository \ Template (имя коллекции известно во время выполнения).

То, что я хочу знать, так же, как обычный старый нативный SQL, если я узнаю имя поля и имя таблицы, на лету, SQL может быть построен и может быть запущен для получения данных:

String dynamicQuery = "SELECT " + commaSeperatedFieldsList + " FROM " + tableName + " WHERE " + criteria;

Есть ли какой-нибудь способ, с помощью которого можно добиться того же в Spring boot + Mon go БД?

1 Ответ

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

Вы можете использовать MongoTemplate для этого, который может быть подключен автоматически, поскольку пружина обеспечивает и настраивает его для вас автоматически.

У него есть метод

find(Query query, Class<T> entityClass, String collectionName)

, который позволяет определить имя пользовательской коллекции и пользовательский entityClass.

Для динамического запроса c используйте BasicQuery в качестве Query подразумевает передачу необработанного запроса mon и go json и полей / проекций как json, если вы хотите ограничить возвращаемые поля.

Используйте org.bson.Document в качестве entityClass, который в основном является * Реализация 1014 *, которая позволяет динамически перебирать поля c.

mongoTemplate.find(new BasicQuery("{ name: \"mongodb\"}", "{ name: 1}"), Document.class, "your-collection-name").forEach(x -> {
    x.get("name"); // access a specific field

    x.forEach((key, value) -> {
        // iterate over all fields
    });
});

Когда вы имеете дело с большим результатом, рассмотрите возможность использования метода stream() MongoTemplate таким же образом, поскольку он не загружает все документы в память одновременно, и вы можете обрабатывать его во время выполнения один за другим.

...