Я инициализирую свою БД обычным способом:
mongoose.connect(`mongodb://uname:pword@127.0.0.1:port/dbname?authSource=admin`, {useNewUrlParser: true, autoIndex: false});
И у меня есть схема, что-то вроде:
var materialSchema = new Schema({
bookID: {type: String, required: true},
active: Boolean,
name: {type: String, required: true},
stockLength: {type: Number, required: true}
});
module.exports = mongoose.model('material', materialSchema);
Когда я создаю новый материал и добавляю его в базу данных, ему автоматически присваивается обычный _id
- это поведение, которое я хочу поддерживать. НО, я также хотел бы, чтобы bookID
был уникальным, автоматически увеличивающимся индексом. Это для хранения на физической полке, а не для запросов или чего-то подобного.
Я бы хотел, чтобы bookID
увеличивался следующим образом:
A-001
A-002
A-003
...
A-098
A-099
A-100
B-001
...
B-100
...
Z-001
...
Z-100
В случае, если шаблон выше не ясен, шаблон начинается с A-001
и в конечном итоге заканчивается Z-100
. Каждая буква идет от 001
до 100
, прежде чем перейти к следующей букве. Каждая новая запись коллекции - это просто следующий идентификатор в шаблоне. Маловероятно, что конец когда-либо будет достигнут, но мы перейдем этот мост, когда доберемся туда.
Я только когда-либо использовал значение по умолчанию _id
для индексации и не могу понять, как создать этот шаблон.
Спасибо за понимание!
Редактировать # 1
Лучшее решение, которое я нашел до сих пор, - это отдельный файл .txt
со всеми идентификаторами, перечисленными по порядку. По мере создания каждого нового объекта вставляйте (... сдвигайте) следующий идентификатор в верхней части файла. Это также может иметь дополнительное преимущество, заключающееся в простом добавлении дополнительных идентификаторов на более позднем этапе. Вероятно, это будет подход, который я выберу, но я все еще заинтересован в решении мангуста, запрошенном выше.
Редактировать # 2
Так что я думаю, что решение, которое я собираюсь использовать, немного другое. В основном, findOne
отсортировано по bookID
по убыванию. Затем используйте возвращаемое значение для установки следующего.
Material.findOne()
.sort({bookID : -1})
.exec((err, mat) => {
if(err) {
// Send error
}else if(!mat) {
// First bookID
}else {
// Indexes exist...
let nextId = getNextID(mat.bookID);
// ...
}
});
Все еще легко изменить getNextID()
, чтобы добавить новые / другие идентификаторы в будущем (если / когда достигнут "Z100")
Еще раз спасибо!