自动递增mongoose模型中的数字字段

wdebmtf2  于 2023-03-18  发布在  Go
关注(0)|答案(1)|浏览(154)

我的网站使用MySql DB,现在更新到MongoDB。有些表中的列会自动增加,我想确保这种情况继续下去。
以下是我到目前为止的发现,但没有一个是工作。
使用** Mongoose 自动增量**插件

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    autoIncrement = require('mongoose-auto-increment');
 
var connection = mongoose.createConnection("mongodb://localhost/myDatabase");
 
autoIncrement.initialize(connection);

EmborderSchema.plugin(autoIncrement.plugin, {
  model: 'Emborder',
  field: 'emborder_id',
  startAt: 28855,
  incrementBy: 1
});

使用预保存挂钩:

EmborderSchema.pre('save', function (next) {
  if (this.emborder_id == undefined) {
    Emborder.findOne({})
      .sort({emborder_id: -1})
      .exec(function (err, data) {
        this.emborder_id = data.emborder_id + 1;
        next();
      })
  } else {
    next();
  }
});

使用第一种方法时出现错误
E11000重复键错误收集:24hd.24hd_emborder索引:emborder_id_1重复密钥:小行星23345
第二种方法产生此错误
E11000重复键错误收集:24hd.24hd_emborder索引:emborder_id_1重复密钥:{:空}
注意:emborder_id是我以前的Mysql数据库中的主键,在这个代码中,emborder_id的值是未定义的,因为我正在添加一个新记录。
请帮助我找出这个方法中的错误。

noj0wjuj

noj0wjuj1#

我会向你推荐第二种方法。

EmborderSchema.pre('save', function (next) {
  var self = this;
  if (self.emborder_id == undefined) {
    Emborder.findOne({})
      .sort({emborder_id: -1})
      .exec(function (err, data) {
        if(!data.emborder_id){
         self.emborder_id = 1;
         next();
        }else{
          self.emborder_id = data.emborder_id + 1;
          next();
        }
      })
    next();
  }
});

要了解更多信息,你可以阅读javascript中的Context

例如,在函数内部,当您说:“this.accoutNumber”,您正在引用属性“accoutNumber”,该属性属于正在其中执行函数的对象。

如果对象“foo”有一个名为“bar”的方法,当JavaScript关键字“this”在“bar”中使用时,它指的是“foo”。如果函数“bar”在全局作用域中执行,则“this”指的是窗口对象。
上下文示例取自--〉https://blog.kevinchisholm.com/javascript/difference-between-scope-and-context/

相关问题