gpt4 book ai didi

javascript - Mongoose :使用钩子(Hook)/中间件来删除引用的对象(有很多)

转载 作者:行者123 更新时间:2023-11-30 20:14:29 25 4
gpt4 key购买 nike

在使用 Mongoose 的 nodejs 应用程序中,我有一个关系有很多:应用程序有很多 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')
}

这行得通,但我想知道如何使用钩子(Hook)。我看过middleware但我不能让它与 pre('remove') 一起工作,它永远不会被调用。我正在使用这样的东西:

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

最佳答案

remove 是一个 middleware这是在架构级别指定的(如在您的示例中),但它在文档级别运行。因此,触发此事件的唯一方法是获取文档,然后对其执行 remove()

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

Mongoose 文档中有一段关于此的内容:

Note: There is no query hook for remove(), only for documents. If you set a 'remove' hook, it will be fired when you call myDoc.remove(), not when you call MyModel.remove(). Note: The create() function fires save() hooks.

关于javascript - Mongoose :使用钩子(Hook)/中间件来删除引用的对象(有很多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52063792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com