Mongoose虚拟属性
虚拟属性 是不会持久化或存储在MongoDB数据库中的文档属性,它们仅在逻辑上存在,不会写入文档的集合中。
通过虚拟属性的 get 方法,我们可以根据已有文档字段的值设置虚拟属性的值,并返回虚拟属性的值。每次访问虚拟属性时,Mongoose都会调用get方法。
安装模块:
步骤1: 您可以访问链接 Install mongoose 获取有关安装 mongoose 模块的信息。您可以使用以下命令安装此软件包:
npm install mongoose
步骤2: 安装 mongoose 模块后,您可以使用以下代码将其导入到您的文件中:
const mongoose = require('mongoose');
数据库: 最初,在数据库 GFG 中,我们有一个空的用户集合。
实现Get方法
文件名:app.js
Javascript
// Requiring module
const mongoose = require('mongoose');
const express = require('express');
const app = express();
// Connecting to database
mongoose.connect('mongodb://localhost:27017/GFG',
{
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
});
// Constructing mongoose schema
const userSchema = new mongoose.Schema({
name: {
first: String,
last: String
}
});
// Setting virtual property using get method
userSchema.virtual('name.full')
.get(function () {
return this.name.first + ' ' + this.name.last;
})
// Creating mongoose model
const User = mongoose.model('user', userSchema);
const newUser = new User({
name: {
first: "David",
last: "Beckham"
}
})
newUser.save()
.then(u => {
console.log("USERNAME: ", u.name.full)
})
.catch(error => {
console.log(error);
})
运行以下命令来执行 app.js 文件:
node app.js
输出:
数据库: 程序执行后,我们的数据库将如下所示。
解释: 这里的模式(schema)包含了字段name.first和name.last,并且有一个虚拟属性name.full。当访问name.full时,将调用get方法,我们获取的全名将是将姓和名拼接在一起的结果。因此,当我们需要获取全名时,不需要分别访问名和姓,并将它们拼接在一起,而是可以通过虚拟属性轻松获取它们。
使用虚拟属性的set方法,我们可以从虚拟属性的值设置现有文档字段的值。
实现Set方法
文件名:index.js
JavaScript
// Requiring module
const mongoose = require('mongoose');
const express = require('express');
const app = express();
// Connecting to database
mongoose.connect('mongodb://localhost:27017/GFG',
{
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
});
// Constructing mongoose schema
const userSchema = new mongoose.Schema({
name: {
first: String,
last: String
}
});
// Setting the firstname and lastname using set method
userSchema.virtual('name.full')
.get(function () {
return this.name.first + ' ' + this.name.last;
})
.set(function (value) {
var fname = value.split(' ');
this.name.first = fname[0];
this.name.last = fname[1];
})
// Creating mongoose model
const User = mongoose.model('user', userSchema);
const newUser = new User({
name: {
full: "Dave Bautista"
}
})
newUser.save()
.then(u => {
console.log("FIRSTNAME: ", u.name.first,
"\nLASTNAME:", u.name.last)
})
.catch(error => {
console.log(error);
})
运行 index.js 文件,使用以下命令:
node index.js
输出:
数据库: 程序执行后,我们的数据库将会像这样。
解释: 在这里,当用户使用虚拟属性 name.full 保存文档时,set函数会自动使用 name.full 设置 name.first 和 name.last 字段的值。因此,借助虚拟属性,我们不需要为创建文档提供每个字段。