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.

Typegoose no está guardando correctamente los subdocumentos de la matriz en la aplicación Nest.js.

Estoy intentando guardar una matriz de subdocumentos TaskOutcome en mi modelo Task, siguiendo la documentación de typegoose:

import { prop } from '@typegoose/typegoose';

class TaskOutcome {
   @prop({ required: true }) public inputId: string;
   @prop() public label?: string;
   @prop() public value?: string;
}

export class Task {
   @prop() public _id: string;
   ...
   @prop({ _id: false, type: () => [TaskOutcome] })
   public outcomes: TaskOutcome[];
}
@Injectable()
export class TaskService {
   constructor(
      @InjectModel(Task) private readonly model: ReturnModelType<typeof task="">,
   ) {}

   public async saveTask(data: TaskDTO) {
      console.log(data.outcomes);
      const options: QueryOptions = { upsert: true, new: true };
      const result = await this.model.findByIdAndUpdate(data.id, data, options);
      console.log(result.outcomes);
   }
}

Cuando guardo un documento de tarea, todas sus propiedades se guardan como se espera, excepto el arreglo de subdocumentos outcomes. En su lugar, obtengo un arreglo de objetos vacíos. Entonces, aunque el primer console.log muestra los datos de entrada correctos, el segundo console.log me muestra [{},{},{}] (confirmado al inspeccionar la base de datos).

¿Algo obvio que esté haciendo mal?

Estoy utilizando @nestjs/core@8.2.4, @typegoose/typegoose@9.3.1, nestjs-typegoose@7.1.38 y mongoose@6.1.2.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basándome en el código proporcionado, parece que los subdocumentos TaskOutcome no se están llenando correctamente con datos al guardar un nuevo documento Task. Un problema puede ser que el objeto data que se pasa a model.findByIdAndUpdate incluye la matriz outcomes, pero no se está mapeando correctamente al tipo de subdocumento TaskOutcome.

    Para solucionar esto, puedes intentar cambiar el método saveTask de la siguiente manera:

    public async saveTask(data: TaskDTO) {
      // mapear la matriz outcomes a subdocumentos TaskOutcome
      const outcomes = data.outcomes.map(outcome => new TaskOutcome(outcome));
      // crear un nuevo objeto Task con los outcomes mapeados
      const task = new Task({
        ...data,
        outcomes
      });
      // guardar el nuevo objeto Task
      const result = await task.save();
      console.log(result.outcomes);
    }
    

    Esto debería mapear correctamente la matriz outcomes al tipo de subdocumento TaskOutcome antes de crear y guardar un nuevo documento Task.

Comments are closed.