Это нормально использовать 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);