Điều này luôn khả thi với MongoDB vì luôn có khả năng cấu trúc các điều kiện truy vấn bằng cách sử dụng Đánh giá JavaScript :
db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
Trường hợp đó sẽ trả về chính xác các tài liệu phù hợp với điều kiện ở đây bằng cách tìm kiếm các khóa có thể có trong tài liệu để có giá trị bắt buộc.
Nhưng nó không thực sự là một câu hỏi về "có thể", nhưng một trong số "đây thực sự là một ý tưởng hay" , câu trả lời cơ bản là "Không".
Cơ sở dữ liệu là những con thú hay thay đổi thích tối ưu hóa với những thứ như chỉ mục và những thứ tương tự, cũng như tập hợp toán tử dự kiến của riêng chúng để giúp cho việc tìm kiếm được sử dụng hiệu quả nhất có thể. Vì vậy, có, bạn có thể thông qua một trình thông dịch ngôn ngữ có hiệu quả đánh giá một điều kiện được mã hóa trên mỗi tài liệu hoặc bạn có thể xem xét lại mẫu thiết kế của mình.
Cơ sở dữ liệu yêu thích "trật tự", vì vậy hãy cung cấp cho nó một ít, vì có một cấu trúc lại có tổ chức đơn giản cho dữ liệu bạn đề xuất:
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
Được tổ chức theo cách đó truy vấn trở nên đơn giản như:
db.attrs.find({ "attrs.value": "14" })
Và tất nhiên có thể hỗ trợ và sử dụng một chỉ mục trên bất kỳ thuộc tính nào của tài liệu con trong mảng.
MongoDB sau cùng là một "cơ sở dữ liệu", và giống như tất cả các cơ sở dữ liệu, nó quan tâm nhất đến "giá trị" của các thuộc tính của nó hơn là tìm kiếm bằng cách sử dụng tên của các "khóa" của nó. Vì vậy, những thứ đại diện cho "dữ liệu" có ý nghĩa không nên là một phần của tên của "khóa", mà chúng phải là "giá trị" của "khóa" với tư cách là "công cụ lý tưởng", như minh họa ở trên.
Có một đường dẫn nhất quán đến dữ liệu bạn muốn truy vấn là cách tối ưu để làm việc với dữ liệu bên trong MongoDB. Sử dụng cấu trúc trong đó các tên khóa thay đổi liên tục, không thể chuyển qua bất kỳ thứ gì khác ngoài mã đang chạy và điều đó chậm hơn rất nhiều và kém hơn về hiệu suất so với việc sử dụng các hoạt động và tiện ích hỗ trợ gốc như chỉ mục.