Автоматическое увеличение числового поля в модели мангуста

Я использовал 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, и в этом коде значение emborder_id не определено, поскольку я добавляю новую запись.

Пожалуйста, помогите мне найти, что не так в этом подходе.


person Sunil Jhamnani    schedule 14.01.2018    source источник
comment
Можете ли вы добавить то, что data напечатать во втором подходе, внутри блока exec.   -  person Himanshu sharma    schedule 14.01.2018
comment
Итак, проблема была в этом. Второе решение сработало, если я назначил this переменной, как это сделал @Himanshusharma. Когда он переходит в функции exec, ссылка this изменяется, и я получал нулевую ошибку.   -  person Sunil Jhamnani    schedule 14.01.2018
comment
Да, проблема была в этом. Отметьте ответ, если вы получили решение.   -  person Himanshu sharma    schedule 14.01.2018
comment
Причина этого в том, что Emborder.findOne({}) имеет свою собственную область действия, а ссылка на this внутри приводит к области Emborder. Итак, если мы возьмем this в переменной self. Работает нормально.   -  person Himanshu sharma    schedule 14.01.2018


Ответы (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();
  }
});

Для получения дополнительной информации вы можете прочитать о Context в javascript.

Например, внутри функции, когда вы говорите: «this.accoutNumber», вы имеете в виду свойство «accoutNumber», которое принадлежит объекту, внутри которого выполняется функция.

Если объект «foo» имеет метод под названием «bar», когда ключевое слово JavaScript «this» используется внутри «bar», оно относится к «foo». Если функция «bar» была выполнена в глобальной области видимости, то «this» относится к объекту окна.

Пример контекста взят из -> https://blog.kevinchisholm.com/javascript/difference-between-scope-and-context/

person Himanshu sharma    schedule 14.01.2018