Nói chung, chỉ các toán tử đường ống mới có thể được chuyển thành truy vấn thông thường ($match
, $limit
, $sort
và $skip
) sẽ có thể sử dụng các chỉ mục trên một tập hợp. Đây là một trong những lý do khiến $geoNear
toán tử được thêm vào trong 2.4 phải ở đầu quy trình.
Sau khi bạn thay đổi các tài liệu với $project
, $group
hoặc $unwind
chỉ mục không còn hợp lệ / có thể sử dụng được nữa.
Nếu bạn có một chỉ mục trên một 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 theo quy trình và sau đó tinh chỉnh thêm các tài liệu đã chọn bằng $match
thứ hai .
Xem xét các tài liệu như:
{ tags: [ 'cat', 'bird', 'blue' ] }
Với chỉ mục trên thẻ tags
.
Nếu bạn chỉ muốn nhóm các thẻ bắt đầu bằng b
thì bạn có thể thực hiện tổng hợp như:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
$match
đầu tiên hạt thô có khớp không bằng cách sử dụng chỉ mục trên thẻ tags
.
Trận đấu 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 {tags:'cat'} khỏi ví dụ).
HTH - Rob.