Explicación detallada de MongoDB_4_Explicación detallada de las operaciones comunes de agregación

1. Datos de prueba

emp集合

db.emp.insert(
    [
        {
    
    
            _id: 1,
            name: "tom",
            age: 13,
            likes: ["basketball", "football"],
            sex: "F",
            dept_id: 1
        },
        {
    
    
            _id: 2,
            name: "jack",
            age: 14,
            likes: ["games", "douyin"],
            sex: "M",
            dept_id: 2
        },
        {
    
    
            _id: 3,
            name: "amy",
            age: 23,
            likes: ["code", "basketball"],
            sex: "F",
            dept_id: 1
        },
        {
    
    
            _id: 4,
            name: "musk",
            age: 42,
            likes: ["car", "space"],
            sex: "F",
            dept_id: 2
        },
        {
    
    
            _id: 5,
            name: "paul",
            age: 34,
            likes: [],
            sex: "F",
            dept_id: 2
        }
    ]
)

dept集合

db.dept.insert(
    [
        {
    
    
            _id: 1,
            d_name: "研发部"
        },
        {
    
    
            _id: 2,
            d_name: "运维部"
        }
    ]
)

2. Demostración sencilla

Una operación de agregación simple es la siguiente, esta operación de agregación pasará por dos etapas de procesamiento de datos:

  • La primera etapa de canalización es $match : todos los documentos se filtrarán sex值为F 并且 dept_id 为2y luego se enviarán a la siguiente operación de canalización;
  • La segunda etapa de canalización es $project : se usa para definir el contenido del campo devuelto, aquí devuelve _id name sex dept_id y el nombre de campo personalizado emp_name toma el valor de name
db.emp.aggregate([
    {
        $match: {
            sex: "F", //匹配 sex = F的
            dept_id: 2 //匹配 dept_id = 2的
        }
    },
    {
        $project: {
            //映射,1显示,0不显示
            _id: 1,
            name: 1,
            sex: 1,
            dept_id: 1,
        }
    }
])

resultado de la operación

inserte la descripción de la imagen aquí

codigo java

    @Test
    void agg() {
    
    
        Aggregation aggregation = Aggregation.newAggregation(
 Aggregation.match(Criteria.where("sex").is("F").and("dept_id").is(2)),
                Aggregation.project("_id", "name", "sex", "dept_id")
        );
		
        //参数一 Aggregation
        //参数二 聚合名
        //参数三 对应的类对象
        AggregationResults<Emp> emp = mongoTemplate.aggregate(aggregation, "emp", Emp.class);
        //调用getMappedResults()方法返回结果集
        List<Emp> mappedResults = emp.getMappedResults();
    }

3.$ Partido

$match se usa principalmente para filtrar datos calificados . Por lo general, $match debe colocarse lo antes posible. En este momento, utilizará el índice para optimizar la consulta y también puede reducir la cantidad de datos que deben procesarse. en la etapa posterior. Los ejemplos son los siguientes:

Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(查询条件)
);

4.$Proyecto

$project se usa principalmente para definir los campos que deben devolverse , 1 significa incluir este campo y 0 significa no incluirlo.

//定义只返回k1和k2字段的值,注意这里必须填集合中的字段名 
Aggregation.project("k1", "k2") 

5.$grupo

La etapa de canalización de $group es similar a group bylas cláusulas y se usa para cálculos de grupos. Los ejemplos son los siguientes:

db.emp.aggregate(
    {
    
    		//根据dept_id分组,查询总年龄和平均年龄
			  $group:{
    
    
						"_id": "$dept_id",
						"age_sum": {
    
    $sum: "$age"},
						"age_avg": {
    
    $avg: "$age"}
				}
		}
)

producción

inserte la descripción de la imagen aquí

codigo java

    @Test
    void agg() {
    
    
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.group("dept_id").sum("age").as("age_sum").avg("age").as("age_avg"),
                Aggregation.sort(Sort.by(Sort.Order.asc("_id")))
        );
        //第三个参数,指定数据每条数据以什么类型返回,这里显然以Map形式返回。
        AggregationResults<Map> emp = mongoTemplate.aggregate(aggregation, "emp", Map.class);
        List<Map> mappedResults = emp.getMappedResults();
        for (Map mappedResult : mappedResults) {
    
    
            System.out.println(mappedResult);
        }
    }

/* 
 *  输出结果
 * 	{_id=1.0, age_sum=36.0, age_avg=18.0} //_id就是 dept_id(这里根据dept_id分组)
 *	{_id=2.0, age_sum=90.0, age_avg=30.0}
 */

Consulte más funciones agregadas después del grupo

inserte la descripción de la imagen aquí

6.$relajarse

$unwind 数组中divide el documento según cada elemento

formato gramatical

{
    
    
  $unwind:
    {
    
    
      path: <field path>,
      includeArrayIndex: <string>,
      preserveNullAndEmptyArrays: <boolean>
    }
}
  • ruta : campo de matriz para expansión ;
  • includeArrayIndex : se usa para mostrar la información de posición del elemento correspondiente en la matriz original;
  • preserveNullAndEmptyArrays : si el valor del campo utilizado para la expansión es nulo o una matriz vacía, el documento correspondiente no se enviará a la siguiente etapa. Si desea pasar a la siguiente etapa, debe establecer esta propiedad en verdadero. Las declaraciones de ejemplo son las siguientes:

ejemplo

db.emp.aggregate(
    {
    
    
			  $unwind:{
    
    
						path: "$likes",
						includeArrayIndex: "arrayIndex",
						preserveNullAndEmptyArrays: true 
				}
		}
)

结果
inserte la descripción de la imagen aquí

Nota: si el valor de preserveNullAndEmptyArrays es falso o no está establecido, los datos de 5 paul no se generarán:

codigo java

    @Test
    void agg() {
    
    
        Aggregation aggregation = Aggregation.newAggregation(
               //默认 没有第二个参数,第三个参数为false
                Aggregation.unwind("likes") 
        );
 
        AggregationResults<Emp> emp = mongoTemplate.aggregate(aggregation, "emp", Emp.class);
        List<Emp> mappedResults = emp.getMappedResults();
        for (Emp mappedResult : mappedResults) {
    
    
            System.out.println(mappedResult);
        }
    }
/*
Emp{id=1, name='tom', age=13, lists=[basketball], sex='F', deptId=1}
Emp{id=1, name='tom', age=13, lists=[football], sex='F', deptId=1}
Emp{id=2, name='jack', age=14, lists=[games], sex='M', deptId=2}
Emp{id=2, name='jack', age=14, lists=[douyin], sex='M', deptId=2}
Emp{id=3, name='amy', age=23, lists=[code], sex='F', deptId=1}
Emp{id=3, name='amy', age=23, lists=[basketball], sex='F', deptId=1}
Emp{id=4, name='musk', age=42, lists=[car], sex='M', deptId=2}
Emp{id=4, name='musk', age=42, lists=[space], sex='M', deptId=2}
*/

7.$clasificar&saltar&limitar

  • $sortSe utiliza principalmente para operaciones de clasificación. Cabe señalar que, si es posible, la operación debe colocarse en la primera etapa de la canalización tanto como sea posible, de modo que el índice se pueda usar para clasificar, de lo contrario, necesita usar memoria para clasificación, y la operación de clasificación será bastante costosa, lo que requerirá un consumo adicional de memoria y recursos informáticos. El ejemplo es el siguiente
  • $limitLimite el número de documentos devueltos.
  • $skipOmitir un cierto número de documentos.
db.emp.aggregate(
    [
		{
    
    $sort:{
    
    age:1}}, //按照年龄升序排序
		{
    
    $skip:2}, //跳过前2条数就
		{
    
    $limit:2} //显示2条数据
		]
)

codigo java

    @Test
    void agg() {
    
    
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.sort(Sort.by(Sort.Order.asc("age"))),
                Aggregation.skip(2),
                Aggregation.limit(2)
        );

        AggregationResults<Emp> emp = mongoTemplate.aggregate(aggregation, "emp", Emp.class);
        List<Emp> mappedResults = emp.getMappedResults();
        for (Emp mappedResult : mappedResults) {
    
    
            System.out.println(mappedResult);
        }
    }
/*运行结果
Emp{id=3, name='amy', age=23, lists=[code, basketball], sex='F', deptId=1}
Emp{id=5, name='paul', age=34, lists=[], sex='F', deptId=2}
*/

8.$buscar

8.1 Consulta de asociación

$lookup es similar a la combinación externa izquierda en la mayoría de las bases de datos relacionales y se usa para realizar la conexión entre diferentes colecciones. Su sintaxis básica es la siguiente:

{
    
    
   $lookup:
     {
    
    
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}
  • from : especifica una colección en la misma base de datos para operaciones de conexión;
  • localField : el campo utilizado para la conexión en la colección de conexiones;
  • ForeignField : el campo utilizado para la conexión en la colección que se conectará;
  • como : especificado para almacenar documentos coincidentes 新数组字段的名称. Si el campo especificado ya existe, se sobrescribirá.
//用dept表的主键_id 连接emp表的外键dept_id
db.dept.aggregate([
   {
    
    
      $lookup:
         {
    
    
            from: "emp",
            localField: "_id",
            foreignField: "dept_id",
            as: "arr"
        }
   }
]) 

inserte la descripción de la imagen aquí

codigo java

    @Test
    void agg() {
    
    
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.lookup("emp", "_id", "dept_id", "arr")
        );
        AggregationResults<Map> emp = mongoTemplate.aggregate(aggregation, "dept", Map.class);
        List<Map> mappedResults = emp.getMappedResults();
        for (Map mappedResult : mappedResults) {
    
    
            System.out.println(mappedResult);
        }
    }

/*
{_id=1.0, d_name=研发部, arr=[{_id=1.0, name=tom, age=13.0, likes=[basketball, football], sex=F, dept_id=1.0}, {_id=3.0, name=amy, age=23.0, likes=[code, basketball], sex=F, dept_id=1.0}]}

{_id=2.0, d_name=运维部, arr=[{_id=2.0, name=jack, age=14.0, likes=[games, douyin], sex=M, dept_id=2.0}, {_id=4.0, name=musk, age=42.0, likes=[car, space], sex=M, dept_id=2.0}, {_id=5.0, name=paul, age=34.0, likes=[], sex=F, dept_id=2.0}]}
*/

8.2 Consultas no asociativas

referencia

9. Referencia

Agregación MongoDB

SpringBoot opera la operación de agregación de MongoDB

Supongo que te gusta

Origin blog.csdn.net/qq_46312987/article/details/125171629
Recomendado
Clasificación