从 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
});
});
当你处理一个大的结果时,考虑使用MongoTemplate
的stream()
方法,因为这不会立即将所有文档加载到内存中,你可以在执行过程中处理它一个一个。
我需要创建一个 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
});
});
当你处理一个大的结果时,考虑使用MongoTemplate
的stream()
方法,因为这不会立即将所有文档加载到内存中,你可以在执行过程中处理它一个一个。