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.

Insertar elementos en un array de mongo a través de mongoose.

Tengo una colección de mongo como el código siguiente:

const ExerciseSchema = new Schema({
  name: { type: String, required: true },
  exercise: [
    {
      exerciseId: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: Exercise,
      },
      period: { type: String, enum: ["day", "night"], required: true },
    },
  ],
  timestamp: { type: Date, default: Date.now() },
});

Cuando intento insertar varios ejercicios al mismo tiempo, considerando que mis ejercicios son un array, mongo solo guarda el primer registro. Por ejemplo, intento insertar:

{
    "name": "Exercise 1",
    "exercise": [
        {
            "exerciseId": "1",
            "period": "night"
        },
        {
            "exerciseId": "1",
            "period": "day"
        }
    ]
}

Y después de guardarlo, el método get me devuelve:

[
    {
        "timestamp": "2021-11-30T14:18:42.455Z",
        "_id": "1",
        "name": "Exercise 1",
        "exercise": [
            {
                "exerciseId": "1",
                "period": "night",
            }
        ],
        "__v": 0
    }
]

Es decir, mongoose solo guarda el primer registro en mi array. ¿Alguien sabe por qué está sucediendo esto?

Este es mi método create del controlador:

exports.create = (req, res) => {
  const {
    name,
    exercise: [{ exerciseId, period }],
  } = req.body;
  const newExercise = new Exercise({
    name,
    exercise: [{ exerciseId, period }],
  });
  newExercise.save((err, data) => {
    if (err) {
      res.status(500).send({ message: err });
      return;
    }
    res
      .status(200)
      .send({
        message: "Success",
      });
  });
};

Nota: Me refiero a mi ExerciseSchema desde el controlador por “new Exercise(…)”.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema está sucediendo porque el método de creación del controlador solo está tomando el primer objeto del array de ejercicios en el cuerpo de la solicitud y guardándolo en la base de datos.

    Para guardar todos los ejercicios en el array, necesitamos modificar el método de creación del controlador para recorrer el array y guardar cada ejercicio por separado. Aquí hay un ejemplo de cómo podría verse el método de creación actualizado:

    exports.create = (req, res) => {
      const { name, exercise } = req.body;
      const newExercise = new Exercise({ name, exercise });
    
      // Recorrer cada ejercicio en el array y guardarlo por separado
      for (let i = 0; i < exercise.length; i++) {
        const { exerciseId, period } = exercise[i];
        newExercise.exercise = [{ exerciseId, period }];
    
        newExercise.save((err, data) => {
          if (err) {
            res.status(500).send({ message: err });
            return;
          }
          if (i === exercise.length - 1) {
            // Enviar una respuesta solo después de que se haya guardado el último ejercicio
            res.status(200).send({ message: "Éxito" });
          }
        });
      }
    };
    

    En este método actualizado, primero creamos un nuevo objeto Exercise con el nombre y todo el array de ejercicios del cuerpo de la solicitud. Luego recorremos cada ejercicio en el array y lo guardamos por separado modificando la propiedad de ejercicio en el objeto recién creado. También debemos verificar si hemos llegado al último ejercicio en el array antes de enviar la respuesta para evitar enviar una respuesta por cada ejercicio guardado.

Comments are closed.