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

时间:2018-01-14 13:04:47

标签: node.js mongodb mongoose auto-increment

我在我的网站上使用MySql DB,现在将其更新为MongoDB。某些表中的列有自动递增,我想确保相同的列继续。 以下是我到目前为止的发现,但没有一个有效。 使用 mongoose-auto-increment 插件

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,
  increamentBy: 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 index:emborder_id_1 dup key:{23345}

第二种方法会出现此错误

  

E11000重复密钥错误集合:24hd.24hd_emborder index:emborder_id_1 dup key:{:null}

注意:emborder_id是我旧的Mysql DB中的主键,并且在我添加新记录时,此代码值emborder_id未定义。

请帮助我找到这个问题出了什么问题。

1 个答案:

答案 0 :(得分:2)

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

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”的方法,当在“bar”中使用JavaScript关键字“this”时,它指的是“foo”。如果函数“bar”在全局范围内执行,则“this”指向窗口对象。

取自 - >的上下文示例https://blog.kevinchisholm.com/javascript/difference-between-scope-and-context/