Tôi đề xuất một sự thay đổi giản đồ để bạn thực sự có thể thực hiện các truy vấn hợp lý trong MongoDB.
Từ:
{
"userId": "12347",
"settings": {
"SettingA": "blue",
"SettingB": "blue",
"SettingC": "green"
}
}
tới:
{
"userId": "12347",
"settings": [
{ name: "SettingA", value: "blue" },
{ name: "SettingB", value: "blue" },
{ name: "SettingC", value: "green" }
]
}
Sau đó, bạn có thể lập chỉ mục trên "settings.value"
và thực hiện một truy vấn như:
db.settings.ensureIndex({ "settings.value" : 1})
db.settings.find({ "settings.value" : "blue" })
Thay đổi thực sự rất đơn giản ..., vì nó di chuyển tên cài đặt và giá trị cài đặt sang các trường hoàn toàn có thể lập chỉ mục và lưu trữ danh sách cài đặt dưới dạng một mảng.
Nếu bạn không thể thay đổi giản đồ, bạn có thể thử giải pháp của @ JohnnyHK, nhưng được cảnh báo rằng về cơ bản đây là trường hợp xấu nhất về mặt hiệu suất và nó sẽ không hoạt động hiệu quả với các chỉ mục.