заполнить в середине поста крючок для «найти» в мангусте

У меня есть схема статей для статей, размещенных на моем сайте пользователями. Он ссылается на коллекцию пользователей:

var ArticleSchema = new Schema({
  title: { // NO MARKDOWN FOR THIS, just straight up text for separating from content
    type: String,
    required: true
  },
  author: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  }
});

Я хочу иметь почтовую ловушку для всех вызовов find/findOne для заполнения ссылки:

ArticleSchema.post('find', function (doc) {
  doc.populate('author');
});

По какой-то причине документ, возвращаемый в хуке, не имеет метода заполнения. Нужно ли заполнять с помощью объекта ArticleSchema, а не на уровне документа?


person PGT    schedule 22.06.2015    source источник
comment
Редактировать: мы отошли от монго для таких вещей. Гораздо проще использовать реляционную базу данных для большинства производственных приложений. Мы используем postgresql.   -  person PGT    schedule 07.02.2019


Ответы (4)


Это потому, что populate — это метод объекта запроса, а не документа. Вместо этого вы должны использовать хук pre, например:

ArticleSchema.pre('find', function () {
    // `this` is an instance of mongoose.Query
    this.populate('author');
});
person Silvestre Herrera    schedule 31.05.2016

Приведенные выше ответы могут не работать, потому что они завершают работу промежуточного программного обеспечения pre hook, не вызывая next. Правильная реализация должна быть

productSchema.pre('find', function (next) {
this.populate('category','name');
this.populate('cableType','name');
this.populate('color','names');
next();

});

person suulisin    schedule 07.02.2019

Чтобы добавить, приведенный здесь документ позволит вам перейти к следующему промежуточному программному обеспечению. Вы также можете использовать следующее и выбрать только некоторые специальные поля. Например, модель пользователя имеет name, email, address, and location, но вы хотите заполнить только имя и адрес электронной почты.

ArticleSchema.pre('find', function () {
    // `this` is an instance of mongoose.Query
    this.populate({path: 'author', select: '-location -address'});
});
person Omambia Dauglous    schedule 02.03.2020

Из документа MongooseJS:

ПО промежуточного слоя для запросов отличается от ПО промежуточного слоя для документов тонким, но важным образом: в ПО промежуточного слоя для документов это относится к обновляемому документу. В промежуточном программном обеспечении запросов mongoose не обязательно имеет ссылку на обновляемый документ, поэтому это относится к объекту запроса, а не к обновляемому документу.

Мы не можем изменить результат из промежуточного программного обеспечения поиска сообщений, поскольку this относится к объекту запроса.

TestSchema.post('find', function(result) {
  for (let i = 0; i < result.length; i++) {
    // it will not take any effect
    delete result[i].raw;
  }
});
person Muhammad Ghanoz Ghazali    schedule 21.02.2017