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
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.
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.
- 1. Chỉ mục cột tổng hợp
- 2. Sự khác nhau giữa chỉ số tổng hợp và chỉ mục bao gồm
- 3. Nhà điều hành đường ống tùy chỉnh với Khung tổng hợp MongoDB
- 4. Đường ống và quy trình
- 5. Chỉ mục tổng hợp so với INCLUDE Chỉ mục bao gồm trong SQL Server
- 6. Các chỉ mục thông thường và tổng hợp được triển khai trong RDB như thế nào?
- 7. Đường ray cách tổng hợp các cột?
- 8. Bảng tổng hợp không có tổng hợp?
- 9. Kết hợp ống kính
- 10. HTTP 1.1 Đường ống
- 11. Đường ray 3: Cách tổng hợp Bản ghi
- 12. Mẫu đường ống ZeroMQ
- 13. Tìm đường ống để tìm
- 14. Truy vấn tổng hợp và không tổng hợp kết hợp trong SQL
- 15. Đường ray lưu trữ thông tin tổng hợp
- 16. R Chức năng đường ống
- 17. tổng hợp/tổng hợp với ggplot
- 18. Đường ống trong lắp ráp
- 19. Tại sao các chế độ xem được lập chỉ mục không có tổng hợp MAX()?
- 20. Sự khác biệt giữa Tổng và Tổng hợp trong LINQ
- 21. ống dẫn và ống dẫn mạng: Kết hợp MonadResource và IO
- 22. Vị trí ống chỉ Oracle
- 23. Sử dụng mục tiêu tổng hợp để ký và triển khai nhiều ứng dụng
- 24. Có phương pháp tối ưu nào để đặt hàng chỉ mục tổng hợp MYSQL không?
- 25. Maven: Tổng hợp và phụ thuộc
- 26. Đường ống vào `adb shell`
- 27. Đường ray - đường ống nội dung - xác định tài nguyên theo thư mục
- 28. Các mục quá cũ trong danh sách bảng tổng hợp
- 29. Lệnh xuất khẩu đường ống
- 30. Hooking vào đường ống wcf
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
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. –