我可以从邮政储蓄中间件执行猫鼬更新吗?

时间:2018-08-24 14:20:51

标签: node.js mongodb mongoose middleware mongoose-schema

是否可以从save发布的猫鼬中间件中更新文档?因为它对我不起作用。

我尝试了不同的方式。

方法1:

QuoteSchema.post('save', function(doc) {
if (doc.quoteString) {
    return;
}
this.quoteString = doc.quoteNumber + "";
this._doc.quoteString = doc.quoteNumber + "";
// update the record with quoteString 
this.update({ _id: this.id }, this, { new: true }, function(err, result) {
    if (!err) {
        console.log("Document Updated");
    }
});
    console.log('post save', doc.quoteString);
});

方法2:因为其中包含已保存的对象ID,所以我直接尝试了。

QuoteSchema.post('save', function(doc) {
if (doc.quoteString) {
    return;
}
this.quoteString = doc.quoteNumber + "";
this._doc.quoteString = doc.quoteNumber + "";
enter code here
// update the record with quoteString 
this.update(function(err) {
    if (!err) {
        console.log("Document Updated");
    }
});
    console.log('post save', doc.quoteString);
});

方法3:

QuoteSchema.post('save', function(doc) {
if (doc.quoteString) {
    return;
}
var _quoteString = doc.quoteNumber+"";

this.update({ _id: doc._id }, { $set: { "quoteString": _quoteString } }, function(err) {
    if (!err) {
        console.log("Document Updated");
    }
});
console.log('post save', doc.quoteString);
});

这些方法都不适合我。

我要做的就是保存后更新 QuoteNumber 字段。 QuoteNumber是从猫鼬自动递增生成的,它需要一个数字字段。并且我还在quoteString字段中保存了quoteNumber的字符串版本,以便在UI中可以自动完成正则表达式搜索。由于正则表达式不适用于数字类型。

任何建议都会有所帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

只需将自动递增字段设置为虚拟,就不必担心后保存挂钩...

const QuoteSchema = new Schema(
  {
    quoteNumber: { type: Number },
    quoteString: { type: String },
  },
);

QuoteSchema.virtual('quote').set(function(value) {
  this.quoteNumber = Number(value);
  this.quoteString = String(value);
});

QuoteSchema.virtual('quote').get(function() {
  return this.quoteNumber;
});

设置:

QuoteSchema.plugin(autoIncrement.plugin, { model: 'Quote', field: 'quote' });