Bạn đúng trong tuyên bố nhất định của tài liệu BSON không phải là tài liệu XML. Vì XML được tải vào một cấu trúc cây bao gồm các "nút", nên việc tìm kiếm trên một khóa trọng tài khá dễ dàng.
Một tài liệu MonoDB không quá đơn giản để xử lý, và đây là một "cơ sở dữ liệu" theo nhiều khía cạnh, vì vậy, nó thường được mong đợi là có một sự "đồng nhất" nhất định về vị trí dữ liệu để có thể dễ dàng "lập chỉ mục" và tìm kiếm.
Tuy nhiên, nó có thể được thực hiện. Nhưng tất nhiên, điều này có nghĩa là một quy trình đệ quy thực thi trên máy chủ và điều này có nghĩa là xử lý JavaScript với $where
.
Là một ví dụ shell cơ bản, nhưng hàm function
chỉ là một đối số chuỗi cho $where
nhà điều hành ở mọi nơi khác:
db.collection.find(
function () {
var findKey = "find-this",
findVal = "please find me";
function inspectObj(doc) {
return Object.keys(doc).some(function(key) {
if ( typeof(doc[key]) == "object" ) {
return inspectObj(doc[key]);
} else {
return ( key == findKey && doc[key] == findVal );
}
});
}
return inspectObj(this);
}
)
Vì vậy, về cơ bản, hãy kiểm tra các khóa có trong đối tượng để xem chúng có khớp với "tên trường" và nội dung mong muốn hay không. Nếu một trong các khóa đó là "đối tượng" thì hãy đệ quy vào hàm và kiểm tra lại.
JavaScript .some()
đảm bảo rằng kết quả phù hợp "đầu tiên" được tìm thấy sẽ trả về từ hàm tìm kiếm cho ra true
kết quả và trả về đối tượng mà ở đó "khóa / giá trị" đã có ở độ sâu nào đó.
Lưu ý rằng $where
về cơ bản có nghĩa là duyệt qua toàn bộ bộ sưu tập của bạn trừ khi có một số bộ lọc truy vấn hợp lệ khác có thể được áp dụng cho "chỉ mục" trên bộ sưu tập.
Vì vậy, hãy sử dụng cẩn thận hoặc hoàn toàn không và chỉ làm việc với việc tái cấu trúc dữ liệu thành một biểu mẫu khả thi hơn.
Nhưng điều này sẽ cho bạn kết quả phù hợp.