// define a schema
const personSchema = new Schema({
name: {
first: String,
last: String
}
},
{
toJSON: {
virtuals: true,
},
toObject: {
virtuals: true,
},
},);
personSchema.virtual('fullName').
get(function() {
return this.name.first + ' ' + this.name.last;
}).
set(function(v) {
this.name.first = v.substr(0, v.indexOf(' '));
this.name.last = v.substr(v.indexOf(' ') + 1);
});
// compile our model
const Person = mongoose.model('Person', personSchema);
这是从文档中定义 #virtuals
让我们有另一个引用 Person 的模型:
const shopSchema = new Schema({
name:String,
owner: { type: Schema.Types.ObjectId, ref: "Person" },
});
const Shop = mongoose.model('Shop', shopSchema);
现在,如何在商店填充 fullName
上获得 owner
虚拟物品。此处,所有者不包括 fullName
const getAllData = async () => {
const shops = await Shop.find().populate("owner").lean();
console.log(shops)
}
答案 0 :(得分:1)
使用lean() 可以绕过所有Mongoose 功能,包括virtuals、getter/setter 和默认值。如果你想通过lean()来使用这些功能,你需要使用相应的插件。
因此,fullName
已从返回的数据中删除。获取 fullName
virtuals 的简单方法是将查询更改为如下所示:
const getAllData = async () => {
const shops = await Shop.find()
.populate({
path: 'owner',
options: {
lean: false
}
})
.lean();
console.log(shops);
};
它不会在 lean()
中使用 populate
,否则您可以完全禁用 lean()
。