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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有可能在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');
});

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

解决方案(感谢杰森)

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

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

参考模式的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
});

可以找到toObjecthere选项的完整列表。

另一答案

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

PersonSchema
    .set('toObject', { getters: true });
另一答案

用于将res.send()中的虚拟包含在模式上的快捷集PersonSchema.set("toJSON", { getters: true });上。

以上是关于是否有可能在Mongoose查询结果中获取虚拟属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose 排序结束时保持空值? [复制]

在 Mongoose 中使用 AND 从两个 OR 查询中获取结果

无法操纵 mongoose 查询结果 - 承诺未定义

如何根据现有的 mongoose 查询检查单个文档?

Nodejs Mongoose 获取属性值的结果数组

mongoose 虚拟属性在 findById 属性中不起作用