Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

102
Vistas
El discriminador de mangosta está ignorando un campo adicional

Entonces, tengo un modelo de Category con tres discriminadores. Uno de ellos, "Asignación", tiene un nuevo esquema para un campo adicional. Sin embargo, cuando se guarda una nueva categoría en la base de datos, ese campo no se guardará, Mongoose lo descarta.

 const CategorySchema = new mongoose.Schema({ name: { type: String, required: [true, "MUST HAVE A NAME"], validate: { validator: isSanitary, message: "NAME CONTAINS ILLEGAL CHARACTERS" } }, amount: { type: Number, required: [true, "MUST CONTAIN AN AMOUNT"] }, removed: { type: Boolean, default: false } }, {discriminatorKey: "kind"}); const Category = mongoose.model("Category", CategorySchema); Category.discriminator("Income", new mongoose.Schema()); Category.discriminator("Bill", new mongoose.Schema()); Category.discriminator("Allowance", new mongoose.Schema({ isPercent: { type: Boolean, required: true } }) ); module.exports = { Income: Income, Bill: Bill, Allowance: Allowance, CategorySchema: CategorySchema };

Requiere el modelo:

 const {Income, Bill, Allowance} = require("../models/category.js");

Código para crear una nueva Categoría:

 /* POST: create a new Category req.body = { account: String (Account id) name: String amount: Number kind: String (Income, Bill, Allowance) isPercent: Boolean } response: Category */ createCategory: function(req, res){ let category = { name: req.body.name, amount: req.body.amount, removed: false }; switch(req.body.kind){ case "Income": category = new Income(category); break; case "Bill": category = new Bill(category); break; case "Allowance": category = new Allowance(category); category.isPercent = req.body.isPercent; break; } res.locals.user.accounts.id(req.body.account).categories.push(category); res.locals.user.save() .then((user)=>{ return res.json(category); }) .catch((err)=>{ console.error(err); return res.json("ERROR: unable to create new category"); }); },

Cuando se guarda una nueva "Asignación", se guarda bien, excepto que isPercent no se guarda en la base de datos. Esto funcionaba anteriormente, pero luego se detuvo cuando hice un pequeño cambio. El único cambio es que comencé a exportar tanto el esquema como el modelo. No tengo ni idea de cómo depurar este problema.

Gracias por cualquier ayuda.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El problema es que está tratando el modelo de Category de la misma manera que el modelo Allowance de categoría de concesión. No puede guardar isPercent en Category , solo Allowance . Observe en los documentos que cuando quieren crear un modelo discriminador, no usan la base, usan el discriminador. Intente exportar también los modelos discriminadores:

 const Income = Category.discriminator("Income", new mongoose.Schema()); const Bill = Category.discriminator("Bill", new mongoose.Schema()); const Allowance = Category.discriminator("Allowance", new mongoose.Schema({ isPercent: { type: Boolean, required: true } }) ); module.exports = { CategorySchema, Category, Income, Bill, Allowance, };

Luego puede actualizar la lógica en su controlador de ruta para crear una Allowance o Category condicionalmente:

 const { Allowance, Category } = require("../models/category"); // ... // Get correct model based on req.body data const Model = req.body.kind === "Allowance" ? Allowance : Category; let category = new Model({ name: req.body.name, amount: req.body.amount, kind: req.body.kind, isPercent: req.body.kind === "Allowance" ? req.body.isPercent : undefined, });

¡Espero que eso ayude!

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda