Tengo dos esquemas definidos, imageSchema y userSchema. imageSchema tiene una clave publicada por: userSchema. La pregunta es: ¿debo eliminar los atributos no utilizados de userSchema (como la contraseña) cuando están anidados en imageSchema? Si es así, ¿cómo hacerlo?
var userSchema = new mongoose.Schema({ email: String, password: String, name: String, }, {versionKey: false}) var imageSchema = new mongoose.Schema({ filePath: String, user: userSchema, createdAt: Date, comments: [{body: "String", by: mongoose.Schema.Types.ObjectId}] }) ... app.post("/upload-image", async function(req, res){ if(req.session.user_id) { ... fileSystem.rename(oldPath, newPath, function(err2){ getUser(req.session.user_id, function(user){ delete user.password var currentTime = new Date().getTime() Image.create({ "filePath": newPath, "user": user, "createdAt": currentTime, "comments": [] }, function(err2, data){ res.redirect("/?message=image_uploaded") }) ...Entonces, después de crear un nuevo documento de imagen, revisé la base de datos, el campo de usuario de la nueva imagen tiene el atributo de contraseña, que no se desea. "Eliminar usuario.contraseña" parece no funcionar. ¿Cómo debo eliminar este atributo? ¿Debería hacerlo al definir el imageSchema o eliminarlo al publicar los datos (la parte app.post)?
Esto se puede hacer de varias maneras. La forma en que me gusta es excluir el campo del esquema y también excluirlo durante la inserción.
var imageSchema = new mongoose.Schema({ filePath: String, user: userSchema.pick(["email", "name"]), // this will return schema with only email and name from the schema createdAt: Date, comments: [{body: "String", by: mongoose.Schema.Types.ObjectId}] }) estamos omitiendo el usuario aquí antes de la inserción, esto también se puede hacer con guion bajo/lodash _.omit(user, 'password')
getUser(req.session.user_id, function({password, ...user}){ Image.create({ "filePath": newPath, "user": user, "createdAt": Date.now(), "comments": [] }) }