从 mongo 数据库中的 spring 引导应用程序中获取数据,其中集合名称和要获取的字段在运行时已知

Fetch data from mongo db in spring boot application where collection name & fields to fetch are known at runtime

我需要创建一个 spring 启动批处理作业,我需要从 mongoDB 中获取数据,而我在编码时没有要获取的集合名称和字段的信息.我只有在批次开始时才得到这个信息。 例如。当批处理开始时,我可以读取属性文件,其中我通过 1 属性 获取集合名称,另一个 属性 给出要获取的字段列表,第三个字段提供 criteria/condition 用于查询 因此,由于这个原因,我无法定义具有集合映射的 Java POJO,或者我无法创建任何 MongoRepository\Template(集合名称在运行时已知)。

我想知道的是,就像普通的老原生 SQL 一样,如果我知道字段名称和 table 名称,可以即时构建 SQL可以触发 & 以获取数据:

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

在 spring boot + mongo DB 中有什么方法可以实现同样的事情吗?

您可以为此使用 MongoTemplate,它可以自动装配,因为 spring 会自动为您提供和配置它。

它有一个

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

让您定义自定义集合名称和自定义实体类的方法。

对于动态查询,使用 BasicQuery as Query impl 传递原始 mongo json 查询和 fields/projection as json if你想限制返回的字段。

使用 org.bson.Document 作为 entityClass,它基本上是一个 Map 实现,它允许您以动态方式迭代字段。

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
    });
});

当你处理一个大的结果时,考虑使用MongoTemplatestream()方法,因为这不会立即将所有文档加载到内存中,你可以在执行过程中处理它一个一个。