Прав сте в определеното твърдение на BSON документ не е XML документ. Тъй като XML се зарежда в дървовидна структура, която се състои от „възли“, търсенето по произволен ключ е доста лесно.
Един MonoDB документ не е толкова лесен за обработка и това е "база данни" в много отношения, така че обикновено се очаква да има известна "еднаквост" на местоположенията на данните, за да улесни както "индексирането", така и търсенето.
Въпреки това може да се направи. Но разбира се това означава рекурсивен процес, изпълняващ се на сървъра и това означава обработка на JavaScript с $where
.
Като основен пример за обвивка, но общата function
е просто низов аргумент към $where
оператор навсякъде другаде:
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);
}
)
Така че по принцип тествайте ключовете, присъстващи в обекта, за да видите дали съвпадат с желаното „име на полето“ и съдържание. Ако някой от тези клавиши се окаже „обект“, след това се върнете към функцията и проверете отново.
JavaScript .some()
гарантира, че намереното "първо" съвпадение ще се върне от функцията за търсене, давайки true
резултат и връщане на обекта, където този "ключ/стойност" е присъствал на известна дълбочина.
Обърнете внимание, че $where
по същество означава преминаване на цялата ви колекция, освен ако няма друг валиден филтър за заявки, който може да се приложи към „индекс“ на колекцията.
Затова използвайте внимателно или въобще не и просто работете с преструктурирането на данните в по-работеща форма.
Но това ще ви даде своето съвпадение.