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

Consulta de documentos que tienen un subcampo interno de un valor dado

Esto siempre ha sido posible con MongoDB porque siempre ha existido la capacidad de construir condiciones de consulta usando Evaluación de JavaScript :

db.attrs.find(function() {
    var attrs = this.attrs;
    return Object.keys(attrs).some(function(key) {
       return attrs[key].value === "14"
    });
})

Donde eso devolverá correctamente los documentos que coincidan con la condición aquí buscando las posibles claves en el documento para el valor requerido.

Pero no es realmente una pregunta sobre "posible", sino más bien una de "¿realmente es una buena idea?" , para lo cual la respuesta básica es "No".

Las bases de datos son bestias volubles a las que les gusta optimizar con cosas como índices y demás, así como su propio conjunto de operadores esperados para que la búsqueda sea lo más eficiente posible. Así que sí, puede pasar por un intérprete de lenguaje que, de manera efectiva, la fuerza bruta evalúe una condición codificada en cada documento, o puede reconsiderar su patrón de diseño.

A las bases de datos les encanta el "orden", así que dale un poco, ya que hay una reestructuración organizada simple de los datos que propones:

{
    "attrs" : [
        { "key": "A1", "type" : "T1", "value" : "13" },
        { "key": "A2", "type" : "T2", "value" : "14" }
     ]
}

Organizada de esa manera, la consulta se vuelve tan simple como:

db.attrs.find({ "attrs.value": "14" })

Y, por supuesto, puede admitir y usar un índice en cualquiera de esas propiedades del subdocumento en la matriz.

Después de todo, MongoDB es una "base de datos" y, como todas las bases de datos, se preocupa más por los "valores" de sus propiedades que por buscar usando los nombres de sus "claves". Por lo tanto, las cosas que representan "datos" significativos no deben ser parte del nombre de una "clave", sino que deben ser el "valor" de una "clave" como un "identificador", como se demuestra arriba.

Tener una ruta coherente a los datos que desea consultar es la forma óptima de trabajar con datos dentro de MongoDB. Usar una estructura en la que los nombres de las claves cambian constantemente, no puede ser atravesada por nada más que el código en ejecución, y eso es mucho más lento y peor para el rendimiento que usar las operaciones y facilidades nativas como los índices.