mongoose,如何正确删除中间件的引用?

时间:2016-11-11 23:32:24

标签: node.js mongodb mongoose model ref

有人帮助我进行猫鼬手术吗?我目前正在建立这个投票系统。 我将此Poll模型设为:

var Poll = new Schema({
    title: {
        type: String,
        required: true
    },
    options: [{text:String, count: {type: Number, default: 0}}],
    author: {
        type: Schema.ObjectId,
        ref: 'Account',
    },
    disabled: {
        type:Boolean,
        default: false,
    },
    date: {type: Date, defalut: Date.now},
});

我将此Log模型设为:

var Log = new Schema({
    ip: String,
    voter: {
        type: Schema.ObjectId,
        ref: 'Account'
    },
    poll: {
        type: Schema.ObjectId,
        ref: 'Poll'
    },
    date: {type: Date, defalut: Date.now},
 });

每次用户投票时,日志都会创建如下内容:

{ ip: '::1',
  voter: 5824e7c3b6e659459818004f,
  poll: 58264b48f767f2270452b5cb,
  _id: 58264b4cf767f2270452b5ce }

现在,如果用户删除了他的一个民意调查,比如58264b48f767f2270452b5cb,我还想删除其中包含相同民意调查ID的所有日志文件。

我读了一些其他的答案,并提出了

的中间件
Poll.pre('remove', function(next){
  var err = new Error('something went wrong');
  this.model('Log').remove({poll: this._id}, function(err){
    if (err) throw err;
  })

  next(err);
});

但它根本不起作用。

我该怎么办?感谢。

1 个答案:

答案 0 :(得分:0)

在当前状态Model.remove()来电不要使用挂钩,为什么?因为在调用时文档无法存在于内存中,所以首先查询mongo然后删除文档以确保钩子正常工作是必要的。

有一个CR用于添加此行为但尚未实现。

所以目前的方法是使用类似的东西:

myDoc.remove();

一个例子,这不会起作用:

var myAccount = new Account({
  name: "jim"
})
var myPoll = new Poll({
  question: "You like stuff?"
})
var myLog = new Log({
  voter: myAccount,
  poll: myPoll
})

myAccount.save()
.then(myPoll.save())
.then(myLog.save())
.then(Poll.remove({
  question: "You like stuff?"
}, function(err) {
  console.log(err)
}))

这将改为:

myAccount.save()
.then(myPoll.save())
.then(myLog.save())
.then(myPoll.remove(function(err) {
  console.log(err)
}))