Hai ragione nella dichiarazione certa di un documento BSON non è un documento XML. Poiché XML viene caricato in una struttura ad albero che comprende "nodi", la ricerca su una chiave arbitraria è abbastanza semplice.
Un documento MonoDB non è così semplice da elaborare, e questo è un "database" per molti aspetti, quindi generalmente ci si aspetta che abbia una certa "uniformità" di posizioni dei dati per rendere facile sia l'"indicizzazione" che la ricerca.
Tuttavia, si può fare. Ma ovviamente questo significa un processo ricorsivo in esecuzione sul server e questo significa elaborazione JavaScript con $where
.
Come esempio di shell di base, ma la function
generale è solo un argomento stringa per $where
operatore ovunque:
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);
}
)
Quindi, in pratica, testa le chiavi presenti nell'oggetto per vedere se corrispondono al "nome campo" e al contenuto desiderati. Se una di queste chiavi è un "oggetto", torna nella funzione e controlla di nuovo.
JavaScript .some()
fa in modo che la "prima" corrispondenza trovata torni dalla funzione di ricerca fornendo un true
risultato e restituire l'oggetto in cui quella "chiave/valore" era presente a una certa profondità.
Nota che $where
essenzialmente significa attraversare l'intera raccolta a meno che non ci sia qualche altro filtro di query valido che può essere applicato a un "indice" sulla raccolta.
Quindi usalo con cura, o non usalo affatto e lavora semplicemente ristrutturando i dati in una forma più praticabile.
Ma questo ti darà la tua corrispondenza.