Использование mongoose-autoincrement с запросом insertMany заполняет индекс _id неупорядоченным образом.

Я использую mongoose-plugin-autoinc, "форк mongoose-auto-increment, который давно не поддерживался" для создания автоматически сгенерированного индекса _id, начинающийся с 0, для каждого документа, вставленного в мою коллекцию.
Вот два моих основных файла:

модели.js

let informationAssetsrow = new Schema({
  ref: {
    type: String
  },
  dep: {
    type: String
  },
  infAss: {
    type: String
  },
  crJls: {
    type: String
  },
  classification: {
    type: String
  },
  bsOwn: {
    type: String
  },
  dtOwn: {
    type: String
  },
  cmts: {
    type: String
  },

  //THIS IS HOW YOU CAN DEFINE YOUR OWN ID
  /**
   *  truck_id: {
    type: Schema.ObjectId, auto: true
  }
   */

}, { // This is supposed to make mongoose ignore _id but it didn't
  // when I declare _id it actually ignores it -_-
  //_id: false
   autoIndex: false 
})
informationAssetsrow.plugin(autoIncrement, 'informationAssetsRow');
 informationAssetsrow.plugin(autoIncrement, {
  model: 'informationAssetsRow',
  startAt: 0,
  incrementBy: 1
});

сервер.js

router.route('/fillinformationAssets').post((req, res) => {
        informationAssetsrow.insertMany([req.body[0], req.body[1], req.body[2], req.body[3], req.body[4], req.body[5], req.body[6]], {
            multi: true
        }).then(documentsInserted => {
            console.log('documentsInserted: ', documentsInserted);
        });
    });

Результат в базе такой:

{
    "_id": 1,
    "ref": "FIRST",
    "dep": "FIRST",
    "infAss": "FIRST",
    "crJls": "FIRST",
    "classification": "FIRST",
    "bsOwn": "FIRST",
    "dtOwn": "FIRST",
    "cmts": "FIRST",
    "__v": 0
}, {
    "_id": 3,
    "dep": "TWO",
    "ref": "TWO",
    "infAss": "TWO",
    "crJls": "TWO",
    "classification": "TWO",
    "bsOwn": "TWO",
    "dtOwn": "TWO",
    "cmts": "TWO",
    "__v": 0
}, {
    "_id": 2,
    "ref": "THREE",
    "dep": "THREE",
    "infAss": "THREE",
    "crJls": "THREE",
    "classification": "THREE",
    "bsOwn": "THREE",
    "dtOwn": "THREE",
    "cmts": "THREE",
    "__v": 0
}

Как видите, документы вставлены по порядку (один, два, три).
Однако

_id индекс

время от времени увеличивается:

Первый документ получил _id=1
Второй документ получил _id=3
Третий документ получил _id=2

Когда мне нужно их заказать, чтобы получить доступ к документам и управлять ими должным образом.
Любая помощь?


person AG_HIHI    schedule 25.07.2019    source источник
comment
Вы пытались поместить _id:false в свою схему и включить autoIndex. затем попробуйте запустить, просто используя truck_id: { type: Schema.Types.ObjectId}. Вам не хватает .Types, хотя в вашем truck_id {type}   -  person Shivam Sood    schedule 25.07.2019
comment
Я думаю, вы неправильно поняли мою проблему. Моя проблема в том, что _id увеличивается в порядке 1-2-3-4...   -  person AG_HIHI    schedule 26.07.2019
comment
@ShivamSood Я нашел решение, проверьте мой ответ, пожалуйста, и дайте мне знать, что вы думаете   -  person AG_HIHI    schedule 26.07.2019


Ответы (1)


Я до сих пор не знаю, почему _id увеличивается беспорядочно. Но я нашел решение сделать документы помеченными упорядоченными _id. Это данные во внешнем интерфейсе, которые я хочу сохранить в базе данных:
введите здесь описание изображения
А вот документы, вставленные с заказанным _id:< br /> введите здесь описание изображения
Вот как я заставил свой код работать, как описано выше:

var async = require('async');

router.route('/fillinformationAssets').post((req, res) => {
    informationAssetsrow.remove({}, (err) => {
        if (err)
            console.log(err);
        else {
            // res.json("informationAssets Collection has been dropped!");
            /*** UPDATE CODE  */
            console.log('REQ.body of informationAssets is ', req.body);
            res.json('Action Plan data has been received on the server side')
            //A Mongoose model doesn't have an insertOne method. Use the create method instead:
            /*** UPDATE CODE  */
            async.series([
                function (callback) {
            informationAssetsrow.create(req.body[0])
                  .then(() => callback(null, 'Row 1 Inserted'));
                },
                function (callback) {
            informationAssetsrow.create(req.body[1])
                  .then(() => callback(null, 'Row 2 Inserted'));
            
                },
                function (callback) {
            informationAssetsrow.create(req.body[2])
                  .then(() => callback(null, 'Row 3 Inserted'));
                },
                function (callback) {
            informationAssetsrow.create(req.body[3])
                  .then(() => callback(null, 'Row 3 Inserted'));
                },
                function (callback) {
            informationAssetsrow.create(req.body[4])
                  .then(() => callback(null, 'Row 5 Inserted'));
                },
              ], function (error, results) {
                console.log(results);
              });
        }
    });
})

Использование Async позволяет мне писать синхронные запросы. То есть: я решаю порядок выполнения запросов.
Надеюсь, это кому-то поможет.

person AG_HIHI    schedule 26.07.2019
comment
Итак, вы планируете повторять обратные вызовы вручную, когда у вас будет, скажем, 1000 строк? Nodejs является асинхронным, что означает, что вы не должны выполнять синхронизированные вызовы, если в этом нет крайней необходимости. Просто подумайте, как вы будете масштабировать свое приложение, когда у вас есть несколько пользователей, которые одновременно получают доступ и пытаются добавить - person Shivam Sood; 26.07.2019
comment
@ShivamSood Я знаю, что это не масштабируется. Мне не нужно масштабировать для этого конкретного варианта использования. К сожалению, это единственное решение, которое я нашел. И я использовал его в крайнем случае. - person AG_HIHI; 26.07.2019