Nói chung MongoDB có thể sử dụng tiền tố chỉ mục để hỗ trợ các truy vấn, tuy nhiên, chỉ mục ghép bao gồm không gian địa lý hoặc trường văn bản là một trường hợp đặc biệt của chỉ mục kết hợp thưa thớt . Nếu tài liệu không bao gồm giá trị cho bất kỳ (các) trường chỉ mục văn bản nào trong chỉ mục kết hợp, thì tài liệu đó sẽ không được bao gồm trong chỉ mục.
Để đảm bảo kết quả chính xác đối với tìm kiếm tiền tố, một kế hoạch truy vấn thay thế sẽ được chọn trên chỉ mục kết hợp thưa thớt:
Thiết lập một số dữ liệu thử nghiệm trong MongoDB 3.4.5 để chứng minh sự cố tiềm ẩn:
db.myCollection.createIndex({ user_id:1, name: 'text' }, { name: 'myIndex'})
// `name` is a string; this document will be included in a text index
db.myCollection.insert({ user_id:123, name:'Banana' })
// `name` is a number; this document will NOT be included in a text index
db.myCollection.insert({ user_id:123, name: 456 })
// `name` is missing; this document will NOT be included in a text index
db.myCollection.insert({ user_id:123 })
Sau đó, buộc chỉ mục văn bản ghép được sử dụng:
db.myCollection.find({user_id:123}).hint('myIndex')
Kết quả chỉ bao gồm một tài liệu duy nhất có trường văn bản được lập chỉ mục name
, thay vì ba tài liệu được mong đợi:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Ngoại lệ này nên được đánh dấu rõ ràng hơn trong tài liệu MongoDB; watch / upvote DOCS-10322 trong trình theo dõi vấn đề MongoDB để cập nhật.