Express 是否可以在Mongoose查询结果中获取虚拟财产?
我正在寻找(但找不到任何)优雅的解决方案,如何在Mongoose model Person中使用虚拟财产全名 Person.jsExpress 是否可以在Mongoose查询结果中获取虚拟财产?,express,mongoose,Express,Mongoose,我正在寻找(但找不到任何)优雅的解决方案,如何在Mongoose model Person中使用虚拟财产全名 Person.js const mongoose = require('mongoose'); const Schema = mongoose.Schema; const PersonSchema = new Schema( { firstName: {type: String, required: true, max: 100}, lastNa
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const PersonSchema = new Schema(
{
firstName: {type: String, required: true, max: 100},
lastName: {type: String, required: true, max: 100}
}
);
PersonSchema
.virtual('fullName')
.get(function () {
return this.firstName + ' ' + this.lastName;
});
module.exports = mongoose.model('Person', PersonSchema);
const express = require('express');
require('./connectDB');
const Person = require('./Person');
const app = express();
app.get('/', async (req, res) => {
const result = await Person.find();
result.map((person) => {
console.log('Virtual fullName property: ', person.fullName);
// console print:
// Jane Smith
});
console.log('All returned persons: ', result);
// console print:
// [{ _id: 5ad9f4f25eecbd2b1c842be9,
// firstName: 'Jane',
// lastName: 'Smith',
// __v: 0 }]
res.send({result});
});
app.listen(3000, () => {
console.log('Server has started at port 3000');
});
实际上我有权访问fullName,但不知道如何将其添加到结果对象
app.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const PersonSchema = new Schema(
{
firstName: {type: String, required: true, max: 100},
lastName: {type: String, required: true, max: 100}
}
);
PersonSchema
.virtual('fullName')
.get(function () {
return this.firstName + ' ' + this.lastName;
});
module.exports = mongoose.model('Person', PersonSchema);
const express = require('express');
require('./connectDB');
const Person = require('./Person');
const app = express();
app.get('/', async (req, res) => {
const result = await Person.find();
result.map((person) => {
console.log('Virtual fullName property: ', person.fullName);
// console print:
// Jane Smith
});
console.log('All returned persons: ', result);
// console print:
// [{ _id: 5ad9f4f25eecbd2b1c842be9,
// firstName: 'Jane',
// lastName: 'Smith',
// __v: 0 }]
res.send({result});
});
app.listen(3000, () => {
console.log('Server has started at port 3000');
});
所以,如果你对如何使用virtuals有任何想法,请发布它
解决方案(感谢Jason)
在导出模型之前,将此代码添加到Person.js:
PersonSchema
.set('toObject', { getters: true });
请参阅架构的说明:
要使所有虚拟现实显示在您的控制台.log
输出中,请将toObject
选项设置为{getters:true}
默认情况下,从mongoose文档到POJO的转换中不包括虚拟路径console.log
导致mongoose自动调用此转换
使用此选项更新PersonSchema
将使虚拟机包含在记录的输出中:
const PersonSchema=新模式({
名字:{
类型:字符串,
要求:正确,
最高:100
},
姓氏:{
类型:字符串,
要求:正确,
最高:100
}
}, {
获得者:真的
});
可以找到
toObject
选项的完整列表。为了将虚拟财产包括到mongoose查询结果中,以便您可以从api端获取虚拟财产,请在数据模型架构中执行以下操作:
PersonSchema
.set('toObject', { getters: true });
用于在express set
PersonSchema.set(“toJSON”,{getters:true})上的res.send()
中包含虚拟元素模式上的代码>。在这些选项中getter:true和virtuals:true之间有什么区别?有什么想法吗?他们似乎是一样的,但不同!