Mon goose увеличение числового идентификатора при создании нового документа - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть модель mon go как таковая:

module.exports = (Schema, ObjectId) => {
  return new Schema({
    objectid: ObjectId,
    creator: String,
    created: Date,
    updated: Date,
    script: String,
    html: String,
    template: Number
  });
};

Вместо того, чтобы давать пользователю objectid или _id, что долго и трудно запомнить, я дам пользователям template это числовой идентификатор, такой как: 1, 2, 3, 4 ...

Проблема в том, что, если я делаю этот подход, я должен:


  const biggestTemplateRes = await db.templates
    .findOne()
    .sort({
      template: -1
    });
  if (biggestTemplateRes) {
    biggestTemplate = biggestTemplateRes.toObject().template;
  }
  ++biggestTemplate;
  console.log({ biggestTemplate });
  return db.templates.create({
    creator,
    created,
    updated,
    template: biggestTemplate,
    ...attrs
  });

найти самый большой шаблон, а затем создайте больший ... который:

  1. снижает производительность, добавляя еще один запрос.
  2. может возникнуть проблема, если самый большой шаблон будет удален, поэтому новый созданный шаблон будет иметь тот же номер шаблона, что и ранее удаленный.

Проблема два выше может быть решена с помощью дополнительной коллекции / модели, которую я могу использовать для поддержания последовательности, но на самом деле это не так решить проблему 1 ...

Можно ли сообщить mon go, что я хочу, чтобы шаблон представлял собой поле числового идентификатора с приращением при создании нового документа?

1 Ответ

0 голосов
/ 22 апреля 2020

ObjectId решает точную проблему, которую вы описываете с генерацией идентификатора. Скорее всего, ObjectId будут глобально уникальными и генерируются на клиенте без связи с базой данных (или любым централизованным органом).

Если вы хотите, чтобы в качестве идентификаторов были последовательные натуральные числа, должно быть какое-то хранилище данных который отслеживает самый высокий использованный идентификатор, и приложение должно взаимодействовать с ним (т. е. выполнить обход), чтобы определить следующий используемый идентификатор.

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

Причина, по которой MongoDB не предоставляет эту функциональность "из коробки", как это делают многие реляционные базы данных, заключается в использовании шардинга - при использовании шардинга приложение взаимодействует с подмножеством все серверы и, следовательно, нет центрального органа, который мог бы сказать вам, какие идентификаторы используются.

...