mongoos - исключить поля виртуальной схемы с заполнением - PullRequest
0 голосов
/ 11 мая 2018

У меня есть схема Item, у которой есть свойство owner, которое я использовал для ссылки на пользовательскую схему ... теперь я пытаюсь заполнить владельца, не получая виртуальные поля 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;
  }
});

1 Ответ

0 голосов
/ 13 мая 2018

Вы не можете исключить виртуальное поле, потому что оно не имеет никакого смысла, потому что оно связано с мангустом.
Вы можете сделать следующее:

userSchema.set('toJSON', {
  virtuals: false
});

Таким образом,виртуалы не будут отправлены в ответ, если это ваша проблема.

...