Introducción

En este artículo os voy a presentar el grupo de Mongodb por múltiples campos. Para entender mejor primero aprenderemos sobre la función de agregación.

Función de agregación de Mongodb

Las funciones de agregación se utilizan en las cláusulas GROUP BY para agregar datos agrupados. Las funciones de agregación tienen un mejor rendimiento cuando se utilizan con la cláusula GROUP BY. Sin embargo, el uso de la función de agregación no se limita a las consultas agrupadas.

Cuando se utiliza una función de agregado en una consulta sin la cláusula GROUP BY, la función de agregado agrega todo el conjunto de resultados (todas las filas que coinciden con la cláusula WHERE). Si no se utiliza la cláusula GROUP BY, algunas funciones de agregación de la lista SELECT sólo pueden utilizarse con otras funciones de agregación. Por eso, la función de agregación debe utilizar la cláusula GROUP BY para conectar con la lista en la lista SELECT.

Por ejemplo, en lugar de utilizar la cláusula GROUP BY, AVG en una lista SELECT sólo puede corresponder a SUM, pero no puede corresponder a una columna específica.

La operación de agregación de MongoDB se utiliza para operaciones por lotes en los datos. Después de agrupar la colección por condición, se realizan una serie de operaciones como la suma, el promedio y otras. Las operaciones de agregación pueden realizar operaciones complejas de colecciones, especialmente para estadísticas matemáticas y minería de datos.

La entrada de la operación de agregación en MongoDB es el documento de la colección. La salida puede ser uno o más documentos. MongoDB ofrece una operación de agregación muy potente que se puede dividir en tres categorías:

  • Operación de agregación
  • Operación de agregación para uso individual
  • Modelo de programación MapReduce

Grupo de MongoDB por múltiples campos

El operador de grupo $ es un agregador que devuelve un nuevo documento. Tiene su propio operador, podemos obtener el campo del documento actual mediante el símbolo $ + nombre del campo. Para entender el grupo de MongoDB por múltiples campos primero, vamos a echar un vistazo a una lista de todos los operadores que se pueden utilizar en $ group:

  • $ sum – Devuelve la suma de todos los campos numéricos.
  • $ avg – Calcula la media entre campos numéricos.
  • $ min – Devuelve el valor mínimo del campo numérico
  • $ max – Obtiene el valor máximo del campo numérico.
  • $ push – Inserta el valor del campo en el campo resultante
  • $ addToSet – Inserta un valor en una matriz del documento resultante, pero no crea duplicados.
  • $ first – Obtiene sólo el primer documento de los agrupados, normalmente para ordenar.
  • $ last – Devuelve el último documento.

Tubería de agregación

En el modo POSIX multihilo, existe un método llamado tubería, cuyo flujo de elementos de datos es ejecutado secuencialmente por un conjunto de hilos en el orden especificado.La tubería de agregación consiste en una etapa. Después de procesar el documento en una etapa, la tubería de agregación transfiere el resultado del procesamiento a la siguiente etapa.

Función de tubo de polímero Filtrar el documento para saber qué documentos cumplen los criterios. Convertir el documento y cambiar la forma de salida del documento.

Cada nivel de la tubería de agregación se define utilizando operadores de etapa, y cada operador de etapa puede utilizar operadores de expresión para calcular la suma, el promedio, la concatenación o los saltos de línea antes de cada nivel. El resultado se devuelve al final y el resultado devuelto puede ser directamente la salida o guardado en la colección.

Flujo de procesamiento

  • Db.collection.aggregate () puede utilizar varios canales al mismo tiempo para el procesamiento de datos.
  • Db.collection.aggregate () utiliza las operaciones nativas de MongoDB para agregar de forma eficiente y soportar operaciones como GroupBy en SQL sin tener que escribir rutinas JS personalizadas.
  • Cada fase del pipeline limita 100 MB de memoria. Si una canalización de un solo nodo supera el límite, MongoDB genera un error. Para procesar grandes cantidades de datos, establezca la propiedad allowDiskUse en true para escribir los datos en un archivo temporal para un nodo de tubería agregada y permitir un límite de memoria de 100 MB.
  • Db.collection.aggregate () puede aplicarse a una serie de rebanadas, pero el resultado no puede perderse en la serie de rebanadas. MapReduce se puede aplicar a una serie de rebanadas, y el resultado se puede perder en una serie de rebanadas.
  • Db.collection.aggregate () devuelve un cursor, los datos se almacenan en la memoria y se pueden gestionar directamente como MongoShell.
  • La salida de db.collection.aggregate () sólo puede guardarse en un documento, y el tamaño del documento BSON está limitado a 16 MB.

Método grouping

Usar el método group es similar a usar la cláusula GROUP BY en SQL. El método group tiene tres parámetros:

  • Key: Muestra la clave del grupo
  • Inicial: Inicializa el campo del documento que representa el grupo de documentos
  • Reducción: Función que devuelve el número de elementos. Esta función utiliza dos parámetros como argumentos: el elemento actual y el documento resultante agregado para el grupo actual.
  • Keyf: parámetro opcional. Utilice una función distinta del argumento clave para representar el objeto clave de retorno.
  • Cond: parámetro opcional. Especifica que la condición debe devolver true, de lo contrario el documento no participará en la agrupación. Si no se especifica este parámetro, todos los documentos participan en la agrupación.
  • Finalizar: parámetro opcional. Representa una función que se lanza antes de devolver un resultado agrupado.

Por ejemplo:`js> db.users.group ({clave: {nombre : true}, inicial: {total : 0},reduce : function (curr, res){res.total += 1}})`

Veamos la expresión. El parámetro key especifica que el grupo se agrupará por nombre: key: {name: true}

El valor del parámetro initial inicializa los campos que representan el documento resultado para el grupo. En este caso, se establece el valor inicial del campo total. Este campo indica el número de elementos del grupo. Como es posible que no haya ningún elemento, se inicializa a cero.

El parámetro reduce representa una función en la que el parámetro curr apunta al objeto actual del grupo y res representa el grupo actual. Si se encuentra otro objeto con un valor específico para el campo nombre, se añade ese documento al grupo y se incrementa el valor total en el documento res en 1.

El uso de $group

El $group utiliza _id para especificar el nombre de la clave a agrupar, utilizando las estadísticas del campo personalizado. El uso de la operación de agregación borrará el concepto de grupo de Mongodb por múltiples campos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
db.users.aggregate({
$match : { edad: { $gte : 18 } }
},{
$group : { _id:$username, count:{$sum:1} }
});
// Mongodb agrupa por múltiples campos
db.users.aggregate({
$match: {antigüedad: {$gte:18} }},
$group: {_id:{nombredeusuario:$nombredeusuario, edad:$gte}, contador:{$suma:1} }
})
// $sum:val Añade val a cada documento
// $avg:val Promedia el valor de cada documento
db.users.aggregate({
$group: { _id:$username, count:{$avg:$age} }
})
db.users.aggregate({
$group: { _id:$username, count:{$max:$age} }
})
db.users.aggregate({
$group: {_id:$nombredeusuario, count:{$min:$edad} }
})
// $first:val Se convierte en el primero del grupo
db.users.aggregate({
$group:{_id:$nombredeusuario, count:{$first: $edad} }
})
db.users.aggregate({
$group:{_id:$nombredeusuario, count:{$último: $edad} }
})
db.users.aggregate({
$group: {_id:$nombredeusuario, count:{$addToSet: $edad} }
})
db.users.aggregate({
$group:{_id:$nombredeusuario, count:{$push: $age} }
})

Mongodb agrupa por múltiples campos utilizando la operación Aggregate

Primero se selecciona la clave en la que se basa la agrupación y luego se divide la colección en grupos según el valor de la clave seleccionada. A continuación, puede crear un documento final agregando los documentos de cada grupo.

El grupo no admite agrupaciones fragmentadas y no puede realizar la agrupación en fragmentos. Si necesita soporte distribuido, debe utilizar aggregate o mapReduce.

1
2
3
4
5
6
7
8
9
10
11
12
13
db.collection.group(document)
{
# Campo de agrupación
key:{key1, key2:1},
# Condiciones de consulta
cond:{},
# Función de agregación
reduce:function(current, result){},
# inicialización
inicial:{},
# Conjunto de funciones de retorno de conteo
finalize:function(){}
}

Calcular el número de elementos de cada columna

1
2
3
4
5
6
7
8
9
SELECT COUNT(*) FROM goods GROUP BY category_id;
db.goods.group({
key:{category_id:1},
cond:{},// todo junto
reduce:function(current, result){// Corresponde a la línea actual,resultado Corresponde a múltiples filas del grupo
resultado.total += 1;
},
inicial:{total:0}
})

Conclusión

Este artículo está escrito para que los desarrolladores entiendan el grupo Mongodb por múltiples campos utilizando la función de agregado. Si encuentras este artículo útil sigue visitando Object Rocket para más artículos relacionados con las bases de datos.

Si necesitas consejo o ayuda en la gestión de la seguridad de tu base de datos, escalabilidad o copias de seguridad no dudes en contactar con nosotros en Object Rocket.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.