Cách lập chỉ mục các thuộc tính động trong MongoDB


8

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ả ...

Câu trả lời:


5

Tôi cũng đã hỏi câu hỏi tương tự (ở dạng mở rộng một chút) trong danh sách gửi thư của người dùng mongodb , nơi tôi nhận được câu trả lời. Đọc từ đó để biết thêm chi tiết. Câu trả lời ngắn gọn là, chiến lược được sử dụng trong câu hỏi sẽ hoạt động tốt, nhưng có một vấn đề khiến nó rất kém hiệu quả. Hy vọng, vấn đề sẽ được khắc phục sớm.

Đối với trường hợp của tôi, tôi chỉ cần truy vấn các kết quả khớp chính xác cho tuple {n, v}, vì vậy tôi có thể tạo một chỉ mục nhiều điểm:

db.mycollection.ensureIndex({"attrs":1})

và làm cho họ truy vấn như thế này:

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

mà hoạt động tuyệt vời và sử dụng các chỉ số rất hiệu quả.


0

Câu hỏi tương tự đã được hỏi ở đây . Bắt đầu từ phiên bản 4.2 của MongoDB, họ đã công bố các chỉ mục ký tự đại diện. Đây là một ví dụ:

db.myCollection.createIndex( { "subdocument.$**": 1 } );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.