{ _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);