Mọi thứ về điều này là khá kinh khủng, bạn không thể lập chỉ mục trên một cái gì đó như các giá trị "tên" và "đường dẫn" của bạn đến mỗi thuộc tính sẽ khác nhau ở mọi nơi. Vì vậy, điều này thực sự không tốt cho các truy vấn.
Tôi nhận thấy bạn đề cập đến cấu trúc "lồng nhau" và bạn vẫn có thể đáp ứng điều này với một đề xuất tương tự và một số gắn thẻ bổ sung, nhưng tôi muốn bạn xem xét ví dụ về loại "danh bạ điện thoại" này:
{
"phones": [
{
"type": "Home",
"name" : "Jeff",
"phone" : "123-123-1234"
},
{
"type": "Work",
"name" : "Jeff",
"phone" : "123-123-1234"
},
]
}
Vì đây thực sự là các tài liệu con trong một mảng, các trường như "tên" luôn chia sẻ cùng một đường dẫn, vì vậy bạn không chỉ có thể lập chỉ mục các tài liệu này (điều này sẽ tốt cho hiệu suất) mà truy vấn rất cơ bản:
db.collection({ "phones.name": "Jeff" })
Điều đó thực hiện chính xác những gì bạn cần bằng cách tìm "Jeff" trong bất kỳ mục "tên" nào. Nếu bạn cần phân cấp, thì hãy thêm một số trường trong các tài liệu con đó để chỉ ra mối quan hệ cha / con mà bạn có thể sử dụng trong quá trình xử lý bài đăng. Hoặc thậm chí dưới dạng một đường dẫn cụ thể hóa có thể hỗ trợ các truy vấn của bạn.
Đó thực sự là cách tiếp cận tốt hơn.
Nếu bạn thực sự phải giữ loại cấu trúc này thì ít nhất hãy làm điều gì đó như thế này với JavaScript sẽ giải quyết vấn đề về độ sâu trong trận đấu đầu tiên:
db.collection.find(
function () {
var found = false;
var finder = function( obj, field, value ) {
if ( obj.hasOwnProperty(field) && obj[field] == value )
found = true;
if (found) return true;
for( var n in obj ) {
if ( Object.prototype.toString.call(obj[n]) === "[object Object]" ) {
finder( obj[n], field, value );
if (found) return true;
}
}
};
finder( this, "name", "Jeff" );
return found;
}
)
Định dạng ở đó là ký hiệu viết tắt cho $where
, đó là một tin khá xấu cho hiệu suất, nhưng cấu trúc của bạn không cung cấp nhiều sự lựa chọn khác. Ở bất kỳ mức độ nào, hàm phải đệ quy vào từng tài liệu lồng nhau cho đến khi tìm thấy "trường" có "giá trị".
Đối với bất kỳ thứ gì ở quy mô sản xuất, hãy thực sự xem xét việc thay đổi cấu trúc thành thứ gì đó có thể được lập chỉ mục và truy cập nhanh chóng. Ví dụ đầu tiên sẽ cung cấp cho bạn một điểm khởi đầu. Dựa vào JavaScript tùy ý cho các truy vấn như cấu trúc hiện tại của bạn hạn chế bạn là một tin xấu.