是否可以在Mongoose查询结果中获取虚拟属性?

时间:2018-04-20 15:55:11

标签: express mongoose

我正在寻找(并且找不到任何)优雅的解决方案如何在Mongoose模型Person中使用虚拟属性 fullName

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

实际上我可以访问fullName,但不知道如何将其添加到结果对象。

app.js

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

所以,如果你有任何想法如何使用虚拟,请发布

解决方案(感谢Jason)

在模型导出之前将此代码添加到 Person.js

PersonSchema
    .set('toObject', { getters: true });

3 个答案:

答案 0 :(得分:1)

参考架构的documentation

  

要在console.log输出中显示所有虚拟内容,请将toObject选项设置为{ getters: true }

默认情况下,虚拟路径不包含在从猫鼬文档到POJO的转换中。 console.log会导致mongoose自动调用此转换。

使用此选项更新PersonSchema将使虚拟记录包含在记录的输出中:

const PersonSchema = new Schema({
  firstName: {
    type: String,
    required: true,
    max: 100
  },
  lastName: {
    type: String,
    required: true,
    max: 100
  }
}, {
  getters: true
});

可以找到toObject选项的完整列表here

答案 1 :(得分:1)

为了将虚拟属性包含到猫鼬查询结果中,以便您可以从api端获取它,请在数据模型架构中执行以下操作:

PersonSchema
    .set('toObject', { getters: true });

答案 2 :(得分:0)

用于将虚拟包含在模式的res.send()的{​​{1}}中。