Du har rätt i att ett BSON-dokument inte är ett XML-dokument. Eftersom XML läses in i en trädstruktur som består av "noder" är det ganska enkelt att söka på en godtycklig nyckel.
Ett MonoDB-dokument är inte så enkelt att bearbeta, och detta är en "databas" i många avseenden, så det förväntas i allmänhet ha en viss "enhetlighet" av dataplatser för att göra det enkelt att både "indexera" och söka.
Ändå kan det göras. Men detta innebär naturligtvis en rekursiv process som körs på servern och detta innebär JavaScript-bearbetning med $where
.
Som ett grundläggande skalexempel, men den allmänna function
är bara ett strängargument till $where
operatör överallt annars:
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);
}
)
Så i princip, testa nycklarna som finns i objektet för att se om de matchar önskat "fältnamn" och innehåll. Om en av dessa nycklar råkar vara ett "objekt", återvänd till funktionen och inspektera igen.
JavaScript .some()
ser till att den "första" hittade matchningen kommer tillbaka från sökfunktionen och ger en true
resultat och returnerar objektet där "nyckeln/värdet" fanns på något djup.
Observera att $where
innebär i huvudsak att du går igenom hela din samling såvida det inte finns något annat giltigt frågefilter än som kan tillämpas på ett "index" på samlingen.
Så använd med försiktighet, eller inte alls och arbeta bara med att strukturera om data till en mer användbar form.
Men detta kommer att ge dig din match.