Thứ tự của các điều kiện trong truy vấn của bạn không ảnh hưởng đến việc nó có thể sử dụng chỉ mục hay không.
Ví dụ:cấu trúc tài liệu điển hình:
{
"FieldA" : "A",
"FieldB" : "B"
}
Nếu bạn có một chỉ mục kết hợp trên A và B:
db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1})
Sau đó, cả hai truy vấn sau sẽ có thể sử dụng chỉ mục đó:
db.MyCollection.find({FieldA : "A", FieldB : "B"})
db.MyCollection.find({FieldB : "B", FieldA : "A"})
Vì vậy, thứ tự của các điều kiện trong truy vấn không ngăn chỉ mục được sử dụng - mà tôi nghĩ đó là câu hỏi bạn đang hỏi.
Bạn có thể dễ dàng kiểm tra điều này bằng cách thử 2 truy vấn trong shell và thêm .explain()
sau khi tìm thấy. Tôi chỉ làm điều này để xác nhận và cả hai đều cho thấy rằng chỉ mục kết hợp đã được sử dụng.
tuy nhiên, nếu bạn chạy truy vấn sau, truy vấn này sẽ KHÔNG sử dụng chỉ mục vì FieldA không được truy vấn trên:
db.MyCollection.find({FieldB : "B"})
Vì vậy, thứ tự của các trường trong chỉ mục xác định liệu nó có thể được sử dụng bởi một truy vấn chứ không phải thứ tự của các trường trong chính truy vấn (đây là những gì Lucas đề cập đến).