好吧,在Spring Data中,这种查询不是
trivial。
坏消息:
Spring Data Repository没有针对的解决方案
MongoDBAggregation。因此,您无法在MongoRepository中实现任何方法,例如
aggregateBy...
好消息:
Spring Data提供了
MongoTemplate允许您执行复杂查询的类,就像在标准MongoDB shell中所做的那样。
因此,由于您只想对
exclude不符合某些条件的子文档进行分类,因此我们需要定义集合
pipelines。
我假设:
zip pres are Numeric (In your example is string)And, to exclude subdocument, we filter by `zip`There is no any other filter
MongoDB聚合为:
db.person.aggregate([ {$unwind: "$address"}, {$match: {"address.zip": 12345}}, {$group: { _id: { "firstName":"$firstName", "lastName":"$lastName", _id:"$_id" }, address: { $push: "$address" } } }, {$project: {_id:0, "firstName":"$_id.firstName", "lastName":"$_id.lastName", "address": "$address"}}])如果所有筛选器均成功,则我们得到:
[ { "address" : [ { "zip" : 12345 }, { "zip" : 12345 } ], "firstName" : "George", "lastName" : "Washington" }]现在,以Spring Data的方式,您需要在项目中添加一些更改:
首先,找到您
mongo-config.xml需要添加的位置:
<!-- Define the mongoDbFactory with your database Name --><mongo:db-factory uri="mongodb://user:pass@localhost:27017/db"/><!-- Define the MongoTemplate --><bean id="mongoTemplate" > <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /></bean>
MongoTemplate是Spring的MongoDB支持的核心类,提供与数据库交互的功能集。该模板
...提供了 域对象 和
MongoDB文档 之间的映射。更多信息
其次,在您的
@Service课程中,添加以下代码以供加载
@PostConstruct
@Autowiredprivate MongoOperations mongoOperations;...public List<Person> findByAddressZipCode(int zip) { List<AggregationOperation> list = new ArrayList<AggregationOperation>(); list.add(Aggregation.unwind("address")); list.add(Aggregation.match(Criteria.where("address.zip").is(zip))); list.add(Aggregation.group("firstName", "lastName").push("address").as("address")); list.add(Aggregation.project("firstName", "lastName", "address")); TypedAggregation<Person> agg = Aggregation.newAggregation(Person.class, list); return mongoOperations.aggregate(agg, Person.class, Person.class).getMappedResults();}注: 这两个,
Person并且
Address应该有默认的空构造!



