Mongoose mongoos-使用populate排除虚拟架构字段
我有一个项目架构,它有一个所有者属性,我用来引用用户架构。。现在,我试图在不获取userSchema虚拟字段的情况下填充所有者,下面是我的模式 用户模式Mongoose mongoos-使用populate排除虚拟架构字段,mongoose,mongoose-schema,mongoose-populate,Mongoose,Mongoose Schema,Mongoose Populate,我有一个项目架构,它有一个所有者属性,我用来引用用户架构。。现在,我试图在不获取userSchema虚拟字段的情况下填充所有者,下面是我的模式 用户模式 let userSchema = new mongoose.Schema({ name: {type: String}, email: {type: String}, phoneNumber: { type: String, required: true, trim: true }, devices: [String
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);
项目架构
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:投影不能同时包含和排除。
你能给我一些建议吗
更新
我通过使用toJson
中的transform
属性找到了这种情况的解决方案
userSchema.set('toJson', {
virtuals: true,
getters: true,
transform: function (doc, ret) {
delete ret._id;
delete ret.isPhoneVerified;
return ret;
}
});
您不能排除虚拟字段,因为它与猫鼬相关,因此没有任何意义。
您可以执行以下操作:
userSchema.set('toJSON', {
virtuals: false
});
这样,如果这是您的问题,则不会在响应中发送虚拟体。如果您不想包含虚拟体,则可以在不更改架构的情况下执行此操作。只需使用
lean()
。这是一种更简洁的方法,因为您不必编辑模式
Model.find(query)
.lean()
.populate('user', 'firstName lastName')
.then(rec => {
// do something
})
.catch(err => {
// handle error
})