Mongoose mongoos-使用populate排除虚拟架构字段

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

我有一个项目架构,它有一个所有者属性,我用来引用用户架构。。现在,我试图在不获取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);
项目架构

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
  })