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.
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!