Spring Data MongoDB - 使用@Query或MongoTemplate和$ elemMatch从嵌套数组中返回一个元素

时间:2015-10-19 14:06:40

标签: java spring mongodb spring-data spring-data-mongodb

我的模型由一系列(汽车)模型组成,这些模型具有可用的燃料类型的嵌套集合(“柴油”,“汽油”,“混合”)。每种燃料都有另一套嵌套的门。

例如:

{ _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"}  } })

如何将其转换为Spring Data Repository中的@Query方法?

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

上面的实现,返回一个包含所有类型燃料的嵌套数组的文档,而不仅仅是作为参数传递的那个。我在哪里可以将$ elemMatch投影放在Spring Data Repository中?

更新:经过一番研究后,我尝试使用自定义存储库,MongoTemplate和BasicQuery类来完成它,遵循此post

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的构造函数时,我得到一个异常,因为它试图访问Model.class中的一个名为$ elemMatch的字段(???)

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)

0 个答案:

没有答案