sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo encontrar el nombre del campo MongoDB a una profundidad arbitraria

Tiene razón en la declaración cierta de que un documento BSON no es un documento XML. Dado que XML se carga en una estructura de árbol que se compone de "nodos", la búsqueda de una clave arbitraria es bastante fácil.

Un documento MonoDB no es tan simple de procesar, y esta es una "base de datos" en muchos aspectos, por lo que generalmente se espera que tenga cierta "uniformidad" de ubicaciones de datos para que sea fácil "indexar" y buscar.

No obstante, se puede hacer. Pero, por supuesto, esto significa un proceso recursivo que se ejecuta en el servidor y esto significa procesamiento de JavaScript con $where .

Como ejemplo de shell básico, pero la function general es solo un argumento de cadena para $where operador en cualquier otro 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);
  }
)

Básicamente, pruebe las claves presentes en el objeto para ver si coinciden con el "nombre de campo" y el contenido deseados. Si una de esas teclas resulta ser un "objeto", recurra a la función e inspeccione nuevamente.

JavaScript .some() se asegura de que la "primera" coincidencia encontrada regrese de la función de búsqueda dando un true resultado y devolver el objeto donde esa "clave/valor" estaba presente en cierta profundidad.

Tenga en cuenta que $where esencialmente significa recorrer toda su colección a menos que haya algún otro filtro de consulta válido que se pueda aplicar a un "índice" en la colección.

Así que utilícelo con cuidado, o no lo use en absoluto, y simplemente trabaje con la reestructuración de los datos en una forma más viable.

Pero esto te dará tu pareja.