使用预/中间件Mongoose模型方法时获取文档ID

时间:2017-06-16 17:11:59

标签: node.js mongodb mongoose npm

我需要从帖子中间获取文档ID,但有时在findAndUpdate时它不存在。

任何人都知道为什么?

const mongoose = require('mongoose'),
      Schema = mongoose.Schema,
      ShiftSchema = new Schema({
        _id: { type: String, 'default': shortid.generate},
        creator_id: { type: String, required: true },
        project_id: { type: String, required: true }
      }),
      _ = require('underscore');

var when_to_notify = ['save', 'findByIdAndUpdate', 'findOneAndUpdate', 'findByIdAndUpdate'];

_.each(when_to_notify, function(pre_func) {
  ShiftSchema.post(pre_func, function() {
    otherFunc(this);
  });
})

function otherFunc(self) {
  doSomethingWith(self._id)
  // typeof self._id == 'undefined' == true 
}

1 个答案:

答案 0 :(得分:1)

中间件文档和查询功能仅支持一组特定功能。

文档中间件支持:

  • init
  • 验证
  • 保存
  • 除去

查询中间件支持这些模型和查询功能:

  • 计数
  • 找到
  • findOne
  • findOneAndRemove
  • findOneAndUpdate
  • insertMany
  • 更新

另一个因素可能是:

  

查询中间件与文档中间件的区别在于微妙但是   重要的方法:在文档中间件中,这是指文档   正在更新。在查询中间件中,mongoose不一定有   对正在更新的文档的引用,因此这是指查询   对象而不是正在更新的文档。

在您的示例中,您将查询和文档中间件混合使用相同的功能,因此上下文将有所不同。文档中间件签名实际上采用了文档参数:

schema.post('save', function(doc) {
  console.log('%s has been saved', doc._id);
});