Spring Boot中使用mongo的复杂查询查找实体中List中的某个属性
在Spring Boot中使用mongodb数据库来进行增删改查操作,一般在Dao层使用MongoRepository来进行一些基础的增删改查,也可以自己根据MongoRepository提供的方法来写一些需要的增删改查操作。例如findFirstById、findByClassificationsIn、findAllByAuthor等。
但是如果需要判断的条件位于查找实体的List字段中,例如:
public class DataItem extends Item{
List<RelatedProcessing> relatedProcessings;
List<RelatedVisualization> relatedVisualizations;
}
@Document
@Data
public class RelatedProcessing {
String proId;
String proName;
String proDescription;
String token;
String xml;
}
在这个数据结构中,如何根据RelatedProcessing 字段中的proId来定位DataItem呢?这时候就需要引入MongoTemplate来进行较为复杂的查询
在这个过程中将使用Criteria。
Criteria对SQL进行封装,可以让开发人员可以用对象的方式对数据库进行操作。
以下为具体的示例
//首先引入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
//初始化Criteria
org.springframework.data.mongodb.core.query.Criteria criteria = org.springframework.data.mongodb.core.query.Criteria.where("relatedProcessings").elemMatch(Criteria.where("proId").is(pcsId));
//使用query
Query query = new Query(criteria);
//匹配DataItem
List<DataItem> dataItems = mongoTemplate.find(query,DataItem.class);
以上代码等同于mongodb数据库操作:
db.dataItem.find({relatedProcessings:{$elemMatch:{proId:"b8faefaa-83ad-4ec7-a282-7b59757a60d6"}}})
通过这些操作,即可匹配到id为pcsId的所有DataItem