En Mongoose, lo virtual es la propiedad que no está almacenada en la base de datos, solo existe lógicamente y no puede consultar directamente sobre la base de esta propiedad. Para saber más sobre lo virtual consulta este artículo Mongoose Virtuals.
Relleno de virtuales:
En MongoDB, la población es el proceso de reemplazar la ruta especificada en el documento de una colección con el documento real de la otra colección.
Mongoose también admite una población de propiedades virtuales durante su creación. Siempre que queramos que nuestra propiedad virtual haga referencia a un modelo de cualquier otra colección, tenemos que rellenarla para que pueda contener los documentos de la otra colección.
Instalar mangosta:
Paso 1: puede visitar el enlace Instalar mongoose para instalar el módulo mongoose. Puede instalar este paquete usando este comando.
npm install mongoose
Paso 2: ahora puede importar el módulo mongoose en su archivo usando:
const mongoose = require('mongoose');
Base de datos: Tenemos dos colecciones de usuarios y publicaciones en nuestra base de datos GFG.
- usuarios: La colección de usuarios tiene dos usuarios Usuario1 y Usuario2.
- publicaciones: la colección de publicaciones está vacía .
Implementación:
- Cree una carpeta y agregue el archivo main.js.
- Para poblar virtual, tenemos que especificar tres opciones necesarias:
- ref: Contiene el nombre del modelo desde el cual queremos poblar el documento.
- localField: Es cualquier campo de la colección actual.
- ForeignField: Es cualquier campo de la colección desde la que queremos poblar el documento.
Mangosta llenará esos documentos del modelo dado en ref , cuyo valor de campo extranjero coincidirá con el valor de campo local de la colección actual.
Ejemplo: ahora veremos cómo completar virtuales en un modelo de mangosta usando Node.js.
main.js
// Requiring module const mongoose = require('mongoose'); // Connecting to database mongoose.connect('mongodb://localhost:27017/GFG', { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false }); // User Schema const userSchema = new mongoose.Schema({ username: String, email: String }) // Post Schema const postSchema = new mongoose.Schema({ title: String, postedBy: mongoose.Schema.Types.ObjectId }) // Creating and populating virtual property 'user' in postSchema // will populate the documents from user collection if // their '_id' matches with the 'postedBy' of the post postSchema.virtual('user', { ref: 'User', localField: 'postedBy', // Of post collection foreignField: '_id', // Of user collection justOne: true }) // Creating user and post models const User = mongoose.model('User', userSchema); const Post = mongoose.model('Post', postSchema); // Function to create a post by the user const createPost = async (next) => { const user = await User.findOne({ _id: '60acfa48e82a52560c32ec0a' }); const newPost = new Post({ title: 'Post 1', postedBy: user._id }) const postSaved = await newPost.save(); console.log("post created"); // The findPost will be called after the post is created next(); } // Function to find the post and show the virtual property const findPost = async () => { const post = await Post.findOne().populate('user'); console.log(post.user); } // Creating the post then showing the virtual property on console createPost(findPost);
Ejecute main.js usando el comando:
node main.js
Producción:
Explicación: aquí buscamos el usuario 1 por el campo _id y luego creamos una publicación cuyo valor del campo postedBy será el valor del campo _id del usuario 1 (por lo tanto, la publicación es creada por el usuario 1 ). Siempre que se cree una publicación, se creará una propiedad virtual ‘usuario’ para la publicación que se completará con el documento del modelo de usuario cuyo valor de campo _id coincide con el valor publicado por la publicación.
Base de datos: después de crear una publicación con un usuario de propiedad virtual completo , podemos ver la publicación 1 en la colección de publicaciones de nuestra base de datos. Pero aquí no podemos ver la propiedad user en la base de datos porque es una propiedad virtual y no se almacena en la base de datos.
Publicación traducida automáticamente
Artículo escrito por localhost3000 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA