2012-10-16 16 views
5

Chúng tôi có một bộ sưu tập của các nguyên tố có cấu trúc sau:MongoDB truy vấn cao cấp: có được các yếu tố trong một mảng phù hợp với một điều kiện thứ hai

yếu tố:

{ 
id : 123, 
items : [ { color: "blue", "groups" : [3, 5] }, { color: "red", "groups" : [6, 8] } ] 
} 

{ 
id : 124, 
items : [ { color: "blue", "groups" : [1, 2] }, { color: "green", "groups" : [5, 9] } ] 
} 

Chúng tôi muốn một cách hiệu quả để có được yếu tố đó có một mục có màu xanh dương có thể truy cập vào các nhóm 5, 9, 27, 123 hoặc 56. Điều này sẽ trả về Element với id 123 nhưng không phải là phần tử có id 124 vì mục phải đáp ứng cả hai điều kiện. Chúng tôi muốn truy vấn càng hiệu quả càng tốt.

Truy vấn này là hiệu quả nhưng không đáp ứng được yêu cầu:

{$and : { "items.groups" : { $in : [5, 9, 27, 123, 56] }, "items.color" : "blue" }} 

vì nó sẽ phù hợp với id = 124 bởi vì nó có một mục phù hợp với "màu xanh" và một số khác phù hợp với nhóm 9.

+0

Tôi đã tìm thấy '$ elemMatch' được chỉ định [trong đơn vị go doc] (http://docs.mongodb.org/manual/tutorial/query-documents/). Là người mới bắt đầu, tôi thấy hữu ích khi xem tất cả các ví dụ từ [đó] (http://docs.mongodb.org/manual/tutorial/query-documents/), có thể một người khác sẽ đến. –

Trả lời

7

Bạn cần sử dụng $elemMatch vì bạn đang tìm kiếm để khớp nhiều thuộc tính của một phần tử mảng đơn:

db.test.find({ items: { $elemMatch: { 
    color: "blue", 
    groups: { $in: [5, 9, 27, 123, 56] } 
}}}); 
Các vấn đề liên quan