如何使用Node.js将虚拟属性添加到mongoose模型中

如何使用Node.js将虚拟属性添加到mongoose模型中

在Mongoose中, 虚拟属性 是指不存储在数据库中的属性,它们只在逻辑上存在,并且不能直接基于此属性查询。想要了解有关虚拟属性的更多信息,请参阅此文章Mongoose Virtuals。

填充虚拟属性:

在MongoDB中, 填充 是将一个集合中的指定路径替换为另一个集合中的实际文档的过程。

Mongoose还支持在创建时对虚拟属性进行填充。每当我们希望虚拟属性引用其他集合的模型时,我们必须对它进行填充,以便它包含其他集合中的文档。

安装Mongoose:

步骤1: 您可以访问此链接安装mongoose模块。您可以使用以下命令来安装此软件包。

npm install mongoose

步骤2: 现在,您可以在文件中导入mongoose模块,使用以下代码:

const mongoose = require('mongoose');

数据库: 我们在数据库GFG中有两个集合 users 和 posts 。

  • users: users 集合中有两个用户 User1 和 User2。
  • posts: posts 集合是空的。

如何使用Node.js将虚拟属性添加到mongoose模型中

实现:

  1. 创建一个文件夹并添加文件 main.js。
  2. 为了填充虚拟字段,我们需要指定三个必要的选项:
  • ref: 它包含我们要从中填充文档的模型的名称。
  • localField: 它是当前集合的任何字段。
  • foreignField: 它是我们要从中填充文档的集合的任何字段。

Mongoose将从给定的 ref 模型中填充那些与当前集合的 localField 值匹配的文档。

示例: 现在我们将看到如何在Node.js中使用Mongoose模型填充虚拟字段。

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);

使用命令运行 main.js

node main.js

输出:

如何使用Node.js将虚拟属性添加到mongoose模型中

说明: 在这里,我们通过_id字段找到User 1,然后创建一个帖子,其postedBy字段的值将是User 1的_id字段的值(因此该帖子由User 1创建)。每当创建一个帖子时,都会为该帖子创建一个虚拟属性’用户’,该属性将被填充为User模型的文档,其_id字段的值与帖子的postedBy值相匹配。

数据库: 使用填充的虚拟属性user创建帖子后,我们可以在数据库的posts集合中看到帖子1。但是,在数据库中我们看不到属性user,因为它是一个虚拟属性,不会存储在数据库中。

如何使用Node.js将虚拟属性添加到mongoose模型中

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程