首页 > 解决方案 > 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;
  }
});

标签: mongoosemongoose-schemamongoose-populate

解决方案


如果您不想包含虚拟对象,则可以在不更改架构的情况下执行此操作。只需使用lean(). 这是一种更简洁的方式,因为您不必编辑架构。

Model.find(query)
  .lean()
  .populate('user', 'firstName lastName')
  .then(rec => {
    // do something
  })
  .catch(err => {
    // handle error
  })

推荐阅读