¿Cómo poblar virtuales en un modelo de mangosta usando Node.js?

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 .

Inicialmente colección de usuarios y publicaciones en la base de datos.

Implementación:

  1. Cree una carpeta y agregue el archivo main.js.
  2. 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:  

Salida después de ejecutar main.js

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.

Colección de publicaciones después de crear la publicación con datos virtuales poblados

Publicación traducida automáticamente

Artículo escrito por localhost3000 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *