Sie haben Recht mit der bestimmten Aussage, dass ein BSON-Dokument kein XML-Dokument ist. Da XML in eine Baumstruktur geladen wird, die aus "Knoten" besteht, ist die Suche nach einem beliebigen Schlüssel ganz einfach.
Ein MonoDB-Dokument ist nicht so einfach zu verarbeiten, und dies ist in vielerlei Hinsicht eine „Datenbank“, daher wird allgemein erwartet, dass es eine gewisse „Einheitlichkeit“ der Datenspeicherorte hat, um sowohl das „Indizieren“ als auch das Suchen zu erleichtern.
Trotzdem kann man es machen. Aber natürlich bedeutet dies einen rekursiven Prozess, der auf dem Server ausgeführt wird, und das bedeutet JavaScript-Verarbeitung mit $where
.
Als einfaches Shell-Beispiel, aber die allgemeine function
ist nur ein String-Argument für $where
Operator überall sonst:
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);
}
)
Testen Sie also im Grunde die im Objekt vorhandenen Schlüssel, um festzustellen, ob sie mit dem gewünschten "Feldnamen" und Inhalt übereinstimmen. Wenn einer dieser Schlüssel zufällig ein "Objekt" ist, dann rekursiv in die Funktion und erneut untersuchen.
JavaScript .some()
stellt sicher, dass die "erste" gefundene Übereinstimmung von der Suchfunktion mit true
zurückgegeben wird Ergebnis und Zurückgeben des Objekts, in dem dieser "Schlüssel/Wert" in einer gewissen Tiefe vorhanden war.
Beachten Sie, dass $where
bedeutet im Wesentlichen, Ihre gesamte Sammlung zu durchlaufen, es sei denn, es gibt einen anderen gültigen Abfragefilter, der auf einen "Index" der Sammlung angewendet werden kann.
Verwenden Sie es also mit Vorsicht oder gar nicht und arbeiten Sie einfach daran, die Daten in eine brauchbarere Form umzustrukturieren.
Aber das wird dir dein Match geben.