2013-03-25 34 views
6

Từ http://docs.mongodb.org/manual/core/indexes/#multikey-indexes, bạn có thể tạo chỉ mục trên trường mảng bằng cách sử dụng chỉ mục nhiều. http://docs.mongodb.org/manual/applications/aggregation/#pipeline-operators-and-indexes liệt kê một số cách để chỉ mục có thể được sử dụng trong khung tổng hợp. Tuy nhiên, có thể có những lúc tôi có thể cần phải thực hiện một $unwind trên một trường mảng để thực hiện một $group. Câu hỏi của tôi là, là các chỉ mục multikey (hoặc bất kỳ chỉ mục nào sử dụng trường mảng đó) vẫn có thể được sử dụng khi chúng được vận hành ở giữa đường ống?Đường ống và chỉ mục tổng hợp

Trả lời

11

Nói chung, chỉ khai thác đường ống có thể được san phẳng để truy vấn thông thường ($match, $limit, $sort, và $skip) sẽ có thể sử dụng các chỉ số trên một bộ sưu tập. Đây là một trong những lý do mà toán tử $geoNear được thêm vào trong 2,4 phải ở đầu đường ống.

Khi bạn tắt tài liệu với $project, $group hoặc $unwind thì chỉ mục không còn hợp lệ/có thể sử dụng được nữa.

Nếu bạn có chỉ mục trên trường mảng, bạn vẫn có thể sử dụng nó trước $unwind để tăng tốc độ lựa chọn tài liệu lên đường ống và sau đó tinh chỉnh thêm tài liệu đã chọn với số $match thứ hai.

Hãy xem xét các tài liệu như:

{ tags: [ 'cat', 'bird', 'blue' ] } 

Với một chỉ mục trên tags.

Nếu bạn chỉ muốn nhóm các thẻ bắt đầu với b sau đó bạn có thể thực hiện một tập hợp như:

{ pipeline: [ 
     { $match : { tags : /^b/ } }, 
     { $unwind : '$tags' }, 
     { $match : { tags : /^b/ } }, 
     /* the rest */ 
    ] } 

Các $match đầu tiên thực hiện các trận đấu hạt thô bằng cách sử dụng chỉ mục trên tags.

Kết quả trùng khớp thứ hai sau $unwind sẽ không thể sử dụng chỉ mục (tài liệu ở trên hiện là 3 tài liệu) nhưng có thể đánh giá từng tài liệu đó để lọc ra các tài liệu bổ sung được tạo (để xóa {thẻ: 'cat'} từ ví dụ).

HTH - Rob.

+0

Cảm ơn câu trả lời. Tuy nhiên, tôi thấy "Khi bạn thay đổi tài liệu bằng ...' $ relax', chỉ mục không còn hợp lệ "mâu thuẫn với phần còn lại của câu trả lời. Bạn có thể giải thích tại sao lại như vậy? – MervS

+0

Rất tiếc, phải rõ ràng hơn. Tôi sẽ cố gắng chỉnh sửa nó trong một giây nhưng trận đấu đầu tiên sử dụng chỉ mục, thứ hai sẽ không. –

0

Hmm @ Rob không cung cấp cho câu trả lời đúng nhưng tôi thấy làm thế nào ông có thể dẫn bạn xuống con đường sai một chút:

Nếu bạn có một chỉ mục trên một lĩnh vực mảng bạn vẫn có thể sử dụng nó trước và sau các $ thư giãn để tăng tốc độ lựa chọn các tài liệu để đường ống và sau đó tinh chỉnh thêm các tài liệu được lựa chọn.

Về cơ bản ví dụ ông đưa ra:

{ pipeline: [ 
     { $match : { tags : /^b/ } }, 
     { $unwind : '$tags' }, 
     { $match : { tags : /^b/ } }, 
     /* the rest */ 
    ] } 

Sẽ không sử dụng một chỉ số multikey qua $unwind. Vì vậy, nó sẽ có thể tìm kiếm tất cả các tài liệu ROOT có tên thẻ bắt đầu bằng b tuy nhiên, nó sẽ không thể $unwind và sau đó lọc các phần phụ trong số $match thứ hai bằng cách sử dụng chỉ mục.

$match sẽ chỉ hoạt động trên chỉ mục trước khi đột biến.

Vì vậy, về cơ bản khi bạn đã tắt tài liệu và tải nó lên đường ống, gần như không thể sử dụng chỉ mục hiện tại.

Các vấn đề liên quan