Você está certo na afirmação certa de que um documento BSON não é um documento XML. Como o XML é carregado em uma estrutura de árvore composta por "nós", pesquisar em uma chave arbitrária é bastante fácil.
Um documento MonoDB não é tão simples de processar, e este é um "banco de dados" em muitos aspectos, portanto, geralmente espera-se que tenha uma certa "uniformidade" de localizações de dados para facilitar a "indexação" e a pesquisa.
Mesmo assim, pode ser feito. Mas é claro que isso significa um processo recursivo em execução no servidor e isso significa processamento JavaScript com
$where
. Como um exemplo básico de shell, mas a
function
geral é apenas um argumento de string para o $where
operador em qualquer outro lugar: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);
}
)
Então, basicamente, teste as chaves presentes no objeto para ver se elas correspondem ao "nome do campo" e ao conteúdo desejados. Se uma dessas chaves for um "objeto", recuse na função e inspecione novamente.
JavaScript
.some()
garante que a "primeira" correspondência encontrada retornará da função de pesquisa fornecendo um true
result e retornando o objeto onde essa "chave/valor" estava presente em alguma profundidade. Observe que
$where
essencialmente significa percorrer toda a sua coleção, a menos que haja algum outro filtro de consulta válido que possa ser aplicado a um "índice" na coleção. Portanto, use com cuidado, ou não use e apenas trabalhe reestruturando os dados em uma forma mais viável.
Mas isso lhe dará o seu jogo.