SpringData MongoDB-使用@Query或Mongotemplate和$Elemmatch

问题描述 投票:0回答:0
{ _id : 'Ford Focus' , fuels : [ {_id : "Diesel" : "doors" : [2 , 3]} , {_id: "Gasoline" , doors : [2, 3, 4, 5] } ] }

如果我想为特定型号和燃料类型提供门,我可以执行:

db.models.find( {"_id" : "Ford Focus" , "fuels._id" : "Diesel"} , { 'fuels' : {$elemMatch: {_id: "Diesel"} } })
如何将其转换为弹簧数据存储库中的@Query方法?

@Query(value="{ 'id' : ?0 , 'fuel' : ?1 }") public Model findDoors(Integer model, String fuel);

上面的实现,返回带有嵌套数组的文档,包括所有类型的燃料,不仅是作为参数传递的文档。在哪里可以将$ Elemmatch投影放在弹簧数据存储库中?

update

:经过一项研究,我尝试使用自定义存储库,Mongotemplate和BasicQuery类对其进行填充
public Model findDoors(Integer model, String fuel){
     Criteria findModelCriteria = Criteria.where("id").is(model);
     Criteria findFuelCriteria = Criteria.where("fuels").elemMatch(Criteria.where("id").is(fuel));
     BasicQuery basicQuery = new BasicQuery(findModelCriteria.getCriteriaObject(), findFuelCriteria.getCriteriaObject());

     return mongoTemplate.findOne(basicQuery, Model.class);
}

在这种情况下,当调用

PropertyPath

的构造函数时,我会得到一个例外,因为它试图访问模型中称为$ Elemmatch的字段。class(???) Caused by: java.lang.IllegalAccessError at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134) at org.springframework.data.mapping.PropertyReferenceException.<init>(PropertyReferenceException.java:59) at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)

您可以尝试以下:

Query query = Query(); Criteria criteria = Criteria.where("id").is(model).and("fuels").elemMatch(Criteria.where("id").is(fuel)); query.fields().elemMatch(Criteria.where("id").is(fuel)); query.addCriteria(criteria); mongoTemplate.findOne(query, your_class);

    

java spring mongodb spring-data spring-data-mongodb
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.