是否有可能在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
});
可以找到toObject
的here选项的完整列表。
另一答案
为了将虚拟属性包含到mongoose查询结果中,以便您可以从api端获取它,请在数据模型模式中执行以下操作:
PersonSchema
.set('toObject', { getters: true });
另一答案
用于将res.send()
中的虚拟包含在模式上的快捷集PersonSchema.set("toJSON", { getters: true });
上。
以上是关于是否有可能在Mongoose查询结果中获取虚拟属性?的主要内容,如果未能解决你的问题,请参考以下文章