自动增加猫鼬模型中的数字字段

Posted

技术标签:

【中文标题】自动增加猫鼬模型中的数字字段【英文标题】:Auto increment a number field in mongoose model 【发布时间】:2018-06-23 07:24:23 【问题描述】:

我在我的网站上使用 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 索引:emborder_id_1 dup key:23345

第二种方法报此错误

E11000 重复键错误采集:24hd.24hd_emborder 索引:emborder_id_1 dup key: : null

注意:emborder_id 是我的旧 Mysql 数据库中的主键,并且在此代码中 emborder_id 的值未定义,因为我正在添加新记录。

请帮我找出这个方法出了什么问题。

【问题讨论】:

你能在exec块内添加data在第二种方法中打印的内容吗? 所以问题出在 this 上。如果我像@Himanshusharma 那样将 this 分配给变量,则第二种解决方案有效。当它进入 exec 函数时, this 引用发生了变化,我得到了 null 错误。 是的,问题就在于此。如果您得到解决方案,请标记答案。 原因是 Emborder.findOne() 有自己的作用域,并且在内部引用 this 会导致 Emborder 作用域。因此,如果我们将 this 放入变量 self 中。它工作正常。 【参考方案1】:

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

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/

【讨论】:

以上是关于自动增加猫鼬模型中的数字字段的主要内容,如果未能解决你的问题,请参考以下文章

使用猫鼬和nestJS自动增加字段

使用猫鼬生成自动增量字段?

当猫鼬模型是新的时,有没有办法自动生成 ObjectId?

猫鼬自动增量

文档创建猫鼬中的自动增量版本

文档创建猫鼬中的自动增量版本