Chà, trong Dữ liệu mùa xuân loại truy vấn như vậy không phải là trivial
.
Tin xấu:
Spring Data Repository không có giải pháp cho MongoDB Aggregation
. Vì vậy, bạn không thể triển khai trong MongoRepository bất kỳ phương thức nào để làm như vậy, chẳng hạn như aggregateBy...
Tin tốt:
Spring Data cung cấp MongoTemplate
lớp cho phép bạn thực thi các truy vấn phức tạp, giống như bạn làm trong trình bao MongoDB tiêu chuẩn.
Vì vậy, vì bạn chỉ muốn exclude
tài liệu con không phù hợp với một số điều kiện, chúng tôi cần xác định pipelines
tổng hợp .
Tôi giả sử:
zip codes are Numeric (In your example is string)
And, to exclude subdocument, we filter by `zip`
There is no any other filter
Tổng hợp MongoDB sẽ là:
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"}}
])
Nếu tất cả các bộ lọc thành công, chúng tôi nhận được:
[
{
"address" : [
{
"zip" : 12345
},
{
"zip" : 12345
}
],
"firstName" : "George",
"lastName" : "Washington"
}
]
Bây giờ, theo cách Spring Data, bạn cần thêm một số thay đổi trong dự án của mình:
Trước tiên, hãy tìm mongo-config.xml
của bạn nơi bạn cần thêm:
<!-- Define the mongoDbFactory with your database Name -->
<mongo:db-factory uri="mongodb://user:[email protected]:27017/db"/>
<!-- Define the MongoTemplate -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
MongoTemplate
là lớp trung tâm của hỗ trợ Spring’s MongoDB cung cấp các bộ tính năng để tương tác với cơ sở dữ liệu. Mẫu ...
cung cấp ánh xạ giữa các đối tượng miền của bạn và tài liệu MongoDB . Thông tin khác
Thứ hai, trong @Service
của bạn lớp, thêm mã sau để được tải trong @PostConstruct
@Autowired
private 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();
}
Lưu ý: Cả hai, Person
và Address
nên có hàm tạo trống mặc định!