Исключить виртуальные поля

У меня есть виртуальное поле fullname:

UserSchema.virtual('fullname').get(function() {  
  return this.firstName + ' ' + this.lastName;
});

Иногда мне нужно это поле в результатах запроса, а иногда нет. Я не понял, как это исключить. Это то, что я пробовал (ничего не менял):

UserModel.findOne({ '_id': userId })
  .select('-fullname')
  .exec(callback);

Должен ли я подойти к этому как-то по-другому?


person Harry    schedule 24.10.2018    source источник


Ответы (1)


Попробуйте отключить виртуальные устройства в toJSON и toObject и включить их в запрос, который вам нужен.

UserModel.findOne({ _id: userId })
   .then(doc => console.log(doc.toObject({ virtuals: true }));

Если вы хотите исключить определенные поля, вы можете просто удалить их перед отправкой документа.

UserModel.findOne({ _id: userId })
   .then(doc => doc.toObject({ virtuals: true }))
   .then(doc => {
     delete doc.mySecretVirtual;
     return doc;
   });
person Asaf Aviv    schedule 24.10.2018
comment
Не работает для меня. Может быть, это потому, что я установил toObject и toJSON как {virtuals: true} в моей модели? - person Harry; 25.10.2018
comment
Да, если вы установите их в toObject и toJSON, насколько я знаю, их нельзя опустить, я обновил свой ответ, возможно, это решит проблему. - person Asaf Aviv; 25.10.2018
comment
Хорошо, это, кажется, работает в основном. Но таким образом, если я хочу исключить виртуальное поле, я должен исключить все виртуальные поля. Есть ли способ исключить одно и включить другое? - person Harry; 25.10.2018
comment
Полагаю, вы могли бы просто удалить их после запроса документа, обновив мой ответ. - person Asaf Aviv; 25.10.2018
comment
Кажется, это работает, спасибо. Я подожду немного, прежде чем соглашусь, чтобы посмотреть, есть ли другие мнения. - person Harry; 25.10.2018