Máte pravdu v určitém prohlášení, že dokument BSON není dokument XML. Vzhledem k tomu, že XML je načteno do stromové struktury, která se skládá z „uzlů“, je vyhledávání podle libovolného klíče docela snadné.
Zpracování dokumentu MonoDB není tak jednoduché a jedná se o „databázi“ v mnoha ohledech, takže se obecně očekává, že bude mít určitou „jednotnost“ umístění dat, aby bylo snadné „indexovat“ i vyhledávat.
Přesto se to dá zvládnout. Ale to samozřejmě znamená rekurzivní proces spouštějící se na serveru a to znamená zpracování JavaScriptu s $where
.
Jako základní příklad shellu, ale obecná function
je pouze řetězcový argument pro $where
operátor všude jinde:
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 zásadě tedy otestujte klíče přítomné v objektu, abyste zjistili, zda odpovídají požadovanému „názvu pole“ a obsahu. Pokud se stane, že jeden z těchto klíčů je "objekt", vraťte se do funkce a znovu zkontrolujte.
JavaScript .some()
zajišťuje, že "první" nalezená shoda se vrátí z vyhledávací funkce s true
výsledek a vrátí objekt, kde byl tento "klíč/hodnota" v určité hloubce přítomen.
Všimněte si, že $where
v podstatě znamená procházení celé vaší kolekce, pokud neexistuje nějaký jiný platný filtr dotazů, který lze použít na "index" v kolekci.
Takže používejte opatrně, nebo vůbec ne a pracujte s restrukturalizací dat do funkčnější podoby.
Ale tohle vám dá shodu.