繁体   English   中英

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

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

我需要创建一个 spring 引导批处理作业,在其中,我需要从 mongoDB 获取数据,其中我没有关于在编码时获取的集合名称和字段的信息。 我仅在批处理开始时才获得此信息。 例如,当批处理开始时,我可以读取属性文件,其中我通过 1 个属性获取集合名称,另一个属性提供要获取的字段列表,第三个字段提供查询的标准/条件因此,我不能定义 Java POJO有集合映射,否则我无法创建任何 MongoRepository\Template(集合名称在运行时已知)。

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

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

有什么方法可以在 spring boot + mongo DB 中实现相同的目标?

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

它有一个

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

该方法允许您定义自定义集合名称和自定义实体类。

对于动态查询,如果要限制返回的字段,请使用BasicQuery作为Query impl 传递原始 mongo json 查询和字段/投影作为 json。

使用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()方法,因为这不会一次将所有文档加载到 memory 中,您可以在执行过程中一一处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM