Mongoose: используйте hook / middleware для удаления ссылочных объектов (имеет много) - PullRequest
0 голосов
/ 28 августа 2018

В приложении nodejs, использующем Mongoose, у меня есть отношение , в котором много : в приложении много клиентов AppClients.

Модель:

const mongoose = require('mongoose')

const appSchema = new mongoose.Schema({
  name: String,
  appClients : [{ type: mongoose.Schema.Types.ObjectId, ref: 'AppClient' }]
})

const App = mongoose.model('App', appSchema)

module.exports = App

const appClientSchema = new mongoose.Schema({
  access_key: String,
  secret_key: String
})

const AppClient = mongoose.model('AppClient', appClientSchema)

Дело в том, что я хочу удалить все документы AppClients, связанные с документом приложения, когда он удаляется. Мой текущий код:

exports.delete = async function(req, res, next) {

  const app = await App.findOne({ _id: req.params['id']}).exec()
  const listToDelete = [...app.appClients]

  await App.deleteOne({ _id: req.params['id']}).exec()
  await AppClient.remove({_id: {$in: listToDelete}}).exec()

  res.redirect('/apps')
}

Это работает, но мне было интересно, как использовать крючок. Я взглянул на middleware , но не могу заставить его работать с pre ('remove'), он никогда не вызывается. Я использовал что-то вроде этого:

appSchema.pre('remove', (next) => {
  console.log('pre remove') //never called
})

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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

appSchema.pre('remove', { query: true }, function() {
  console.log('remove');
});
0 голосов
/ 28 августа 2018

remove - это промежуточное программное обеспечение , которое указано на уровне схемы (как в вашем примере), но работает на уровне документа. Таким образом, единственный способ получить это - это получить документ и затем выполнить remove() для него

const app = await App.findOne({ _id: req.params['id']}).exec();
await app.remove(); //prints 'pre remove'

В документации Mongoose есть параграф об этом:

Примечание: нет ловушки запроса для remove (), только для документов. Если вы установите хук «удалить», он будет срабатывать при вызове myDoc.remove (), а не при вызове MyModel.remove (). Примечание: функция create () запускает ловушки save ().

...