Je hebt gelijk in de bepaalde stelling dat een BSON-document geen XML-document is. Aangezien XML wordt geladen in een boomstructuur die uit "knooppunten" bestaat, is zoeken op een willekeurige sleutel vrij eenvoudig.
Een MonoDB-document is niet zo eenvoudig te verwerken, en dit is in veel opzichten een "database", dus wordt over het algemeen verwacht dat het een zekere "uniformiteit" van gegevenslocaties heeft om het gemakkelijk te maken om zowel te "indexeren" als te zoeken.
Toch kan het. Maar dit betekent natuurlijk wel dat er een recursief proces op de server wordt uitgevoerd en dit betekent JavaScript-verwerking met $where
.
Als een basis shell-voorbeeld, maar de algemene function
is slechts een stringargument voor de $where
operator overal elders:
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);
}
)
Test dus eigenlijk de sleutels die in het object aanwezig zijn om te zien of ze overeenkomen met de gewenste "veldnaam" en inhoud. Als een van die sleutels een "object" is, ga dan terug naar de functie en inspecteer opnieuw.
JavaScript .some()
zorgt ervoor dat de "eerste" gevonden overeenkomst terugkeert uit de zoekfunctie met een true
resultaat en het object retourneren waar die "sleutel/waarde" op enige diepte aanwezig was.
Merk op dat $where
betekent in wezen dat u uw hele verzameling doorkruist, tenzij er een ander geldig zoekfilter is dan kan worden toegepast op een "index" op de verzameling.
Dus wees voorzichtig, of helemaal niet en werk gewoon met het herstructureren van de gegevens in een meer werkbare vorm.
Maar dit geeft je je match.