2014-10-29 14 views
17

Tôi đang cố gắng tìm tài liệu trong đó trường bắt đầu bằng một giá trị.Tôi có thể thực hiện truy vấn MongoDB "bắt đầu bằng" trên trường tài liệu phụ được lập chỉ mục không?

Quét bảng bị tắt bằng cách sử dụng notablescan.

này hoạt động:

db.articles.find({"url" : { $regex : /^http/ }}) 

này không:

db.articles.find({"source.homeUrl" : { $regex : /^http/ }}) 

tôi nhận được lỗi:

error: { "$err" : "table scans not allowed:moreover.articles", "code" : 10111 } 

Có chỉ số trên cả hai urlsource.homeUrl:

{ 
    "v" : 1, 
    "key" : { 
     "url" : 1 
    }, 
    "ns" : "mydb.articles", 
    "name" : "url_1" 
} 

{ 
    "v" : 1, 
    "key" : { 
     "source.homeUrl" : 1 
    }, 
    "ns" : "mydb.articles", 
    "name" : "source.homeUrl_1", 
    "background" : true 
} 

Có bất kỳ giới hạn nào với truy vấn regex trên chỉ mục tài liệu phụ không?

+1

Nên làm việc, điều gì xảy ra khi bạn giải thích? Bạn đã thử chạy nó với một db cho phép quét? (với một giải thích) –

+0

Tôi đã cố gắng chạy một giải thích nhưng nó đã mất quá lâu tôi đã phải giết nó. Các truy vấn đều trả lại kết quả mong đợi nếu tôi bật quét bảng. – tjrobinson

Trả lời

19

Khi bạn vô hiệu hóa quét bảng, điều đó có nghĩa là bất kỳ truy vấn nào mà bảng quét "thắng" trong trình tối ưu hóa truy vấn sẽ không chạy được. Bạn đã không đăng một giải thích nhưng nó là hợp lý để giả định đó là những gì đang xảy ra ở đây dựa trên lỗi. Hãy thử chỉ rõ chỉ mục một cách rõ ràng:

db.articles.find({"source.homeUrl" : { $regex : /^http/ }}).hint({"source.homeUrl" : 1}) 

Điều đó sẽ loại bỏ việc quét bảng dưới dạng lựa chọn có thể và cho phép truy vấn trả về thành công.

+0

Điều này có vẻ hứa hẹn mặc dù tôi nhận được: lỗi: {"$ err": "gợi ý xấu", "mã": 10113} – tjrobinson

+0

Đó là lỗi bạn nhận được khi bạn chỉ định một chỉ mục không tồn tại. Điều này gợi ý rằng hoặc là thiếu, chưa hoàn thành xây dựng (lưu ý nền: true), hoặc bạn có thể có lỗi đánh máy –

+0

Điểm tốt, mặc dù tôi đã xác nhận rằng chỉ mục đã hoàn thành xây dựng và vẫn gặp lỗi tương tự. Thậm chí kỳ lạ hơn, nếu tôi chỉ định tên của một chỉ mục không thuộc tài liệu phụ, ví dụ: url, tôi nhận được kết quả nhưng họ không tôn trọng truy vấn regex! Ví dụ: db.articles.find ({"source.homeUrl": {$ regex:/^ http /}}) gợi ý ({"url": 1}) – tjrobinson

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