2012-04-18 29 views
9

Các chỉ số giúp trang tại http://www.mongodb.org/display/DOCS/Indexes không đề cập đến $ elemMatch và vì nó ngày ngày để thêm một chỉ mục trên bộ sưu tập tượng 2M + của tôi, tôi nghĩ rằng tôi muốn hỏi này:

Tôi đang làm một truy vấn như:

{ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } } 

Nếu tôi thêm một chỉ số

{lc:1, group:1, indices.text:1, indices.pos:1} 

sẽ truy vấn này với các thành phần $ elemMatch có thể được chạy hoàn toàn thông qua các chỉ số?

Trả lời

15

Dựa trên câu hỏi của bạn, tôi tưởng tượng rằng tài liệu của bạn trông giống như thế này:

{ 
    "_id" : 1, 
    "lc" : "eng", 
    "group" : "xyz", 
    "indices" : [ 
     { 
      "text" : "as", 
      "pos" : 2 
     }, 
     { 
      "text" : "text", 
      "pos" : 4 
     } 
    ] 
} 

Tôi tạo ra một bộ sưu tập kiểm tra với các tài liệu định dạng này, tạo chỉ mục, và chạy các truy vấn mà bạn đăng tải với .explain() tùy chọn.

Chỉ số đang được sử dụng như mong đợi:

> db.test.ensureIndex({"lc":1, "group":1, "indices.text":1, "indices.pos":1}) 
> db.test.find({ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } }).explain() 
{ 
    "cursor" : "BtreeCursor lc_1_group_1_indices.text_1_indices.pos_1", 
    "isMultiKey" : true, 
    "n" : NumberLong(1), 
    "nscannedObjects" : NumberLong(1), 
    "nscanned" : NumberLong(1), 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : NumberLong(0), 
    "millis" : 0, 
    "indexBounds" : { 
     "lc" : [ 
      [ 
       "eng", 
       "eng" 
      ] 
     ], 
     "group" : [ 
      [ 
       "xyz", 
       "xyz" 
      ] 
     ], 
     "indices.text" : [ 
      [ 
       "as", 
       "as" 
      ] 
     ], 
     "indices.pos" : [ 
      [ 
       { 
        "$minElement" : 1 
       }, 
       { 
        "$maxElement" : 1 
       } 
      ] 
     ] 
    }, 
    "server" : "Marcs-MacBook-Pro.local:27017" 
} 

Các tài liệu về tính năng .explain() có thể được tìm thấy ở đây: http://www.mongodb.org/display/DOCS/Explain

.explain() có thể được sử dụng để hiển thị thông tin về một truy vấn, bao gồm chỉ mục nào (nếu có) được sử dụng.

+0

Cảm ơn Marc - và có các tài liệu của tôi trông như thế. Tôi nhận thấy từ giải thích mặc dù rằng 'indexOnly' là sai. Điều đó không chỉ ra rằng BSON phải được giải nén và quét mặc dù các trường đều nằm trong chỉ mục? –

+0

Rất vui được trợ giúp! IndexOnly là không thể với một chỉ số multikey. Điều này là do mỗi tài liệu nhúng riêng lẻ đều có mục nhập riêng trong chỉ mục. Toàn bộ mảng "chỉ mục" không được lưu trữ trong một mục chỉ mục duy nhất. Vì vậy, mặc dù chỉ mục được sử dụng, các tài liệu thực tế (s) phải được đọc. Điều này được giải thích trong phần "Kết hợp mảng chính xác với chỉ mục" của tài liệu "Multikeys": http://www.mongodb.org/display/DOCS/Multikeys – Marc

+0

Tôi có thể hiểu rằng nếu tôi truy vấn 'db.test.find ({lc: "eng", nhóm: "xyz", "indices.text:" as "," indices.pos ": {$ gt: 1}}})' không có $ elemMatch nó sẽ cần phải quét các đối tượng, nhưng vì elemMatch yêu cầu cùng một đối tượng phụ đã có trong mục nhập chỉ mục, phải không? –

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