2012-05-02 25 views
5

Với Spring-Data, bạn có thể sử dụng chú thích @Document để chỉ định bộ sưu tập nào cần lưu đối tượng. Nói rằng tôi có hai lớp, Sinh viên và Giáo viên, cả hai đều tiếp tục vào bộ sưu tập người. Khi tôi thực thi đoạn mã sau:Mongodb Spring-Data truy vấn nhiều lớp được lưu trữ trong cùng một bộ sưu tập

mongo.find(new Query(), Teacher.class); 

kết quả chứa cả Học sinh và Giáo viên. Nhìn vào dữ liệu được tạo bởi Spring-Data, mỗi tài liệu chứa một trường "_class" cho biết lớp đó được duy trì từ đó.

Đây là trường không được sử dụng để tìm kiếm làm bộ lọc chỉ trả lại cho giáo viên? Làm cách nào để tôi chỉ truy vấn Giáo viên khác ngoài việc thực hiện việc này:

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class); 

Trả lời

1

Đây là câu hỏi ít nhiều về cách thiết kế bộ sưu tập của bạn. Vì Mongo không biết gì về các loại, chúng ta phải thêm siêu dữ liệu bổ sung để có thể phân biệt các tài liệu với nhau. Vì vậy, khi truy vấn bạn sẽ cần phải thêm các ràng buộc này vào truy vấn. Lưu ý rằng bạn có thể tham khảo khóa _class thông qua DefaultMongoTypeMapper.DEFAULT_TYPE_KEY.

Chúng tôi nghĩ về việc thêm một số API để truy vấn để diễn tả người duy nhất muốn có được văn bản của một loại nhất định như thế này:

mongo.find(new Query(Teacher.class), Teacher.class); 

Nó vẫn cảm thấy một chút lạ mà bạn phải lớp miền nhà nước hai lần (điều này có ý nghĩa nếu bạn muốn giới hạn kết quả đối với các tài liệu của một kiểu nhất định nhưng ánh xạ chúng vào một lớp khác). Ngoài ra, chúng tôi chỉ có thể giới hạn kết quả đối với tài liệu mang theo chính xác rằng loại là loại được lưu trữ dưới dạng Chuỗi và chỉ có thể áp dụng thừa kế nếu lớp đã được tải. Vì vậy, khi truy vấn tài liệu có loại Person, trước tiên chúng tôi phải tải tất cả tài liệu, thử tra cứu loại, thực hiện kiểm tra loại và có khả năng vứt bỏ kết quả không phụ thuộc vào lý do hiệu suất.

Một tùy chọn khác là lưu trữ tất cả các loại mà lớp được gán cho (khá nhiều giao diện và siêu lớp ngoại trừ Object có thể) nhưng điều đó sẽ gây ra một lượng dữ liệu được lưu trữ. Điều này có thể được lần lượt tiếp cận bằng cách thêm một lá cờ vào chú thích @Document.

Tóm lại: hiện tại, không có cách nào khác nhưng vui lòng tăng vé JIRA nếu bạn có đề xuất cách cải thiện điều này.

+0

Cảm ơn Oliver, tôi sẽ nâng cao một vé nếu tôi đưa ra một giải pháp tốt. – ltfishie

+0

Đi qua mongodb Jira, tôi đã xem vé này https://jira.springsource.org/browse/DATAMONGO-128 là thị trường cố định là 1.0.M3. Đây có phải là nguồn gốc không? – ltfishie

+0

Có nhưng điều này không chạm vào kịch bản của bạn. Vé bao gồm việc có thể lưu trữ 'Person' và' Teacher' bên trong cùng một bộ sưu tập và có thể truy vấn các đối tượng từ nó và nhận 'Person' và' Teacher' instantiated (do đó thông tin kiểu cần thiết). Nó không thực sự xem xét để cải thiện "chỉ đọc" giáo viên' đối tượng "kịch bản. –

1

đây là giải pháp tốt nhất cho câu hỏi này:

query.restrict(Teacher.class,Teacher.class); 
+3

Cung cấp thêm chi tiết về câu trả lời được đề xuất sẽ rất hữu ích cho OP – Hawk

+0

Hoàn hảo, cảm ơn. –