如何使用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 集合是空的。
实现:
- 创建一个文件夹并添加文件 main.js。
- 为了填充虚拟字段,我们需要指定三个必要的选项:
- 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
输出:
说明: 在这里,我们通过_id
字段找到User 1,然后创建一个帖子,其postedBy字段的值将是User 1的_id
字段的值(因此该帖子由User 1创建)。每当创建一个帖子时,都会为该帖子创建一个虚拟属性’用户’,该属性将被填充为User模型的文档,其_id字段的值与帖子的postedBy值相匹配。
数据库: 使用填充的虚拟属性user创建帖子后,我们可以在数据库的posts集合中看到帖子1。但是,在数据库中我们看不到属性user,因为它是一个虚拟属性,不会存储在数据库中。