mongoose - mongoos - 使用填充排除虚拟模式字段
问题描述
我有一个项目模式,它有一个我曾经引用用户模式的所有者属性。现在我试图在不获取 userSchema 虚拟字段的情况下填充所有者,这是我的模式。
用户模式
let userSchema = new mongoose.Schema({
name: {type: String},
email: {type: String},
phoneNumber: {
type: String,
required: true,
trim: true
},
devices: [String],
verified: {
phoneNumber: {
type: Boolean,
default: false
}
},
settings: {
showNumber: {type: Boolean},
showEmail: {type: Boolean}
},
role: {
type: String,
enum: constants.user.roles,
required: true,
default: constants.user.defaultRole
}
});
userSchema.virtual('isPhoneVerified').get(function () {
return !!this.verified.phoneNumber;
});
module.exports = mongoose.model('user', userSchema);
项目架构
let itemSchema = new mongoose.Schema({
title: {type: String, required: true},
price: {type: Number},
owner: {
type: mongoose.Schema.Types.ObjectId,
ref: 'user',
require: true
}
});
let autoPopulate = function(next) {
this.populate({
path: 'owner',
select: {name: 1, _id: 0, isPhoneVerified: 0}
});
next();
};
itemSchema.pre('find', autoPopulate);
itemSchema.pre('findOne', autoPopulate);
module.exports = mongoose.model('item', itemSchema);
所以当我试图排除该isPhoneVerified
字段时,我得到了这个错误
MongoError: Projection cannot have a mix of inclusion and exclusion.
你能给我建议吗?
更新
我通过使用transform
.toJson
userSchema.set('toJson', {
virtuals: true,
getters: true,
transform: function (doc, ret) {
delete ret._id;
delete ret.isPhoneVerified;
return ret;
}
});
解决方案
如果您不想包含虚拟对象,则可以在不更改架构的情况下执行此操作。只需使用lean()
. 这是一种更简洁的方式,因为您不必编辑架构。
Model.find(query)
.lean()
.populate('user', 'firstName lastName')
.then(rec => {
// do something
})
.catch(err => {
// handle error
})
推荐阅读
- arrays - 不确定如何将此宏转换为使用多维数组而不是使用工作表比较
- java - 不显示在 html 中
- html - CSS - 表格数据不在固定表格标题下 - 溢出-X
- php - 在白色背景上打印一个 php 变量,然后停止执行
- sql - 当所有值都匹配一行时如何选择数据
- c++ - 在 C++ 中的一行中初始化多个变量
- android - 被谷歌保护阻止
- php - 使用 api.php 部署 laravel 项目后出现 NotFoundHttpException,为什么?
- javascript - Javascript:用闭包概括反应可加载
- django - 无法将日期选择器小部件中的日期保存到我的数据库中