MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Dữ liệu khởi động mùa xuân và MongoDB - Lọc truy vấn mảng tài liệu con

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, PersonAddress nên có hàm tạo trống mặc định!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $ trong Nhà điều hành đường ống tổng hợp

  2. Regex với OR trong Java - mongoDB

  3. Lỗi Mongo DB:toán tử không hợp lệ:$ search khi thực hiện tìm kiếm $ text

  4. Chỉ thêm Unique vào mảng và cập nhật số lượng trường

  5. Chỉ mục trên trường ts trong oplog.rs không được cập nhật