@ikerya

Нормально ли использовать Set в .pre('save') mongoose для гарантирования уникальности индексов?

Это нормально использовать Set в .pre('save') mongoose для гарантирования уникальности индексов?

const schema = new mongoose.Schema({
    id: {
        type: Number,
        unique: true
    },
    name: String
});

const store = new Set(); 
const getPathIndexName = (path, value) => `${path}_${value}`;
const paths = Object.keys(schema.paths)
  .map((key) => {
      const {
          path,
          _index
      } = schema.paths[key];

      if (!_index || !_index.unique) {
          return null;
      }

      return path;
  })
  .filter((path) => !!path);

// paths = [ 'id' ]

function checkUniqueness(next) {
    const self = this;

    // self = {id: 5, name: 'test'}
  
    const indexes = paths
        .map((path) => {
            return self[path] ?
                getPathIndexName(path, self[path]) : // getPathIndexName('id', 5) = 'id_5'
                null;
        })
        .filter((index) => !!index);

  // indexes = [ 'id_5' ]

    for (let i = 0; i < indexes.length; i++) {
        const index = indexes[i];

        if (store.has(index)) {
            throw new Error(`Duplicate: ${index}`);
        }

        store.add(index);
    }

    next();
};

schema.pre('save', checkUniqueness);
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы