MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como encontrar o nome do campo MongoDB em profundidade arbitrária


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.