Express 是否可以在Mongoose查询结果中获取虚拟财产?

Express 是否可以在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

我正在寻找(但找不到任何)优雅的解决方案,如何在Mongoose model Person中使用虚拟财产全名

Person.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');
});
实际上我有权访问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之间有什么区别?有什么想法吗?他们似乎是一样的,但不同!