es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo devolver el resultado de una etapa de canalización anterior a un nuevo campo.

Tengo esta función que devuelve un array de información de las instituciones:

const getInstitutionsInfo = async () => {
  const sum_current_students = {
    $addFields: { number_of_current_students: { $size: "$current_students" } },
  };
  const sort_by_largest_number_of_current_students = {
    $sort: {
      number_of_current_students: -1,
    },
  };

  const pipeline = [
    sum_current_students,
    sort_by_largest_number_of_current_students,
  ];
  const response = await Institution.aggregate(pipeline);
  return response;
};

El resultado es un array:

[Institución_1_data, Institución_2_data ... ]

donde cada Institución_X_data es un objeto.

Me gustaría agregar otra etapa al pipeline al final para que el resultado final sea así:

{
  result: [Institución_1_data, Institución_2_data ... ]
}

Probé diferentes combinaciones de $reduce, pero no logré obtener ese resultado.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para agregar la etapa final al pipeline que envolverá el array de información de instituciones en un objeto con una clave “result”, puedes utilizar la etapa $group con un acumulador $push para crear un nuevo campo de array con todos los datos de la institución, y luego proyectarlo a un objeto con la clave “result” utilizando $project.

    Aquí tienes un ejemplo de cómo modificar la función original con esta etapa:

    const getInstitutionsInfo = async () => {
      // etapas anteriores de la función original
      const sum_current_students = {
        $addFields: { number_of_current_students: { $size: "$current_students" } },
      };
      const sort_by_largest_number_of_current_students = {
        $sort: {
          number_of_current_students: -1,
        },
      };
      const pipeline = [
        sum_current_students,
        sort_by_largest_number_of_current_students,
      ];
    
      // nueva etapa final con $group y $project
      pipeline.push({
        $group: {
          _id: null,
          result: { $push: "$$ROOT" }
        }
      }, {
        $project: {
          _id: 0,
          result: 1
        }
      });
    
      const response = await Institution.aggregate(pipeline);
      return response[0];
    };
    

    Esto devolverá un objeto con la clave “result” que contiene el array de información de instituciones. El _id: null en la etapa $group significa que todos los documentos en el pipeline serán agrupados en un único documento de salida.

Comments are closed.