Mongoose使用pre或post hook删除所有引用的objectID元素

时间:2017-05-02 22:06:40

标签: node.js mongodb mongoose mongoose-schema

我有两个架构

用户架构

var UserSchema = new mongoose.Schema({
  name: {
        first: { type: String, trim: true, required: true },
        last:  { type: String, trim: true, required: true }
  },
  department:{type: mongoose.Schema.Types.ObjectId,ref:'Department'},
  image:{ data: Buffer, contentType: String },
  phone: {type:String, required: true},
  email: {type: String, required: true, unique:true}
});

部门架构

var DeparmentSchema = new mongoose.Schema({
name:{ type: String, required: true },
date:{type:Date,default: Date.now},
employees:[{type: mongoose.Schema.Types.ObjectId,ref:'User'}] });

删除部门后,还应删除所有员工。我试着逐个循环和删除。但它似乎没有效率。

我可以在部门架构中使用mongoose pre或post hook删除所有员工吗?

编辑: 无法在用户架构中添加部门字段

2 个答案:

答案 0 :(得分:0)

我认为你不需要做任何循环。

你尝试过这样的事吗?

var User = require(/* etc */);

DeparmentSchema.pre('remove', function (next) {
    console.log('deleting department', this);
    User.remove({ 
        _id: { $in: this.employees } // this.employees must be an array of ObjectIds
    }, function (err) {
        console.log(err);
        if (err) return next(err);
        next();
    });
});

还要确保使用.remove()来触发挂钩。

答案 1 :(得分:0)

我使用这个预挂钩解决了这个问题

DepartmentSchema.pre('remove', function(next) {
    var self=this;
    this.employees.forEach(function(employee){
        self.model('User').remove({ _id: employee },function (err) {
            if(err){
                return next(err)
            }
        });
    });
    next();

 });