Tôi đã theo dõi loại dữ liệu (đơn giản hóa một chút từ trường hợp thực tế của tôi) trong MongoDB:
{
"name":"some name",
"attrs":[
{"n":"subject","v":"Some subject"},
{"n":"description","v":"Some great description"},
{"n":"comments","v":"Comments are here!"},
]
}
Mảng attrs là một thùng chứa cho các thuộc tính động, tức là tôi không biết trước loại thuộc tính nào được đặt ở đó. n là viết tắt của tên và v là viết tắt của giá trị.
Cuốn sách MongoDB In Action mô tả đây là một giải pháp để có các thuộc tính động trong trường hợp các thuộc tính hoàn toàn có thể xác định được. Nó cũng mô tả rằng bạn có thể lập chỉ mục như thế này:
db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})
Các câu hỏi sau đó có thể được thực hiện như thế này:
db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})
Khi tôi kiểm tra điều này, tôi nhận được hiệu suất rất kém. Tôi đã thử nghiệm với mycollection có 2 triệu tài liệu và không có chỉ số nào có vẻ hoạt động tốt hơn.
Vì vậy, câu hỏi đặt ra là, có cách nào để lập chỉ mục loại cài đặt thuộc tính động này để việc lập chỉ mục cho hiệu suất tốt? Trong trường hợp của tôi, không thể có các khóa như "chủ đề" và "mô tả" và lập chỉ mục tất cả ...