Actualmente estoy siguiendo un tutorial sobre la implementación de una base de datos (Mongoose) en un sitio web simple creado con Express-framework. No tengo ningún problema para entender el concepto de modelos, pero no le doy sentido a las líneas que siguen al comentario " URL virtual para libro " en el código adjunto. ¿Cómo operan estas líneas y qué papel tiene en este contexto tener una propiedad virtual?
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var BookSchema = new Schema( { title: {type: String, required: true}, author: {type: Schema.Types.ObjectId, ref: 'Author', required: true}, summary: {type: String, required: true}, isbn: {type: String, required: true}, genre: [{type: Schema.Types.ObjectId, ref: 'Genre'}] } ); // Virtual for book's URL BookSchema .virtual('url') .get(function () { return '/catalog/book/' + this._id; }); //Export model module.exports = mongoose.model('Book', BookSchema);
Los virtuales se utilizan normalmente para las propiedades calculadas en los documentos.
BookSchema // 'url' is the name of the virtual .virtual('url') .get(function () { // you are computing dynamic url return '/catalog/book/' + this._id; });
Lo importante de los virtuales es que no almacena nada en la base de datos. Imagine que almacenó "nombre" y "apellido", pero desea mostrar el nombre completo sin tener la columna "nombre completo". Estaría utilizando datos repetidos en la base de datos si agrega la propiedad de fullname
a su esquema, esto se ralentizará y también le costará. En su lugar, escribe virtual:
YourSchema.get(function(){ return this.firstname + ' ' + this.lastname })
También puede ir un paso más allá y devolver la propiedad de nombre fullname
tal como está en una columna en la base de datos. Mongoose Schema toma objeto de opciones
let options={ toJSON:{ virtuals: true } }
establecer el virtual
let YourSchemaVirtual=YourSchema.virtual('fullname')
ahora al consultar la base de datos, obtenga la colección
YourModel.findOne({firstname:"name"}).exec(function(err,user){ res.send(user) })
En el valor de retorno, verá el campo de nombre completo calculado como fullname
this.firstname + ' ' + this.lastname
fullname
no tenga un nombre completo almacenado en la base de datos.