Создайте уникальное поле autoincrement с Мангустом
дана схема:
var EventSchema = new Schema({
id: {
// ...
},
name: {
type: String
},
});
Я хочу сделать id
уникальный и автоувеличение. Я пытаюсь понять реализация mongodb но есть проблемы с пониманием того, как это сделать правильно в мангусте.
у меня вопрос: Как правильно реализовать поле autoincrement в мангусте без использования каких-либо плагинов и так далее?
2 ответов
вот хороший пример реализации автоматически увеличиваемых полей с использованием Мангуста:
var CounterSchema = Schema({
_id: {type: String, required: true},
seq: { type: Number, default: 0 }
});
var counter = mongoose.model('counter', CounterSchema);
var entitySchema = mongoose.Schema({
testvalue: {type: String}
});
entitySchema.pre('save', function(next) {
var doc = this;
counter.findByIdAndUpdate({_id: 'entityId'}, {$inc: { seq: 1} }, function(error, counter) {
if(error)
return next(error);
doc.testvalue = counter.seq;
next();
});
});
вы должны выполнить Шаг 1 из документация mongodb во-первых.
Да, вот "тощий" на этой функции.
вам нужно иметь эту коллекцию в вашей базе данных mongo. Он действует как одновременное выделение ключа одной записи истины, если вы хотите. Пример монго показывает, как выполнить "атомарную" операцию, чтобы получить следующий ключ и убедиться, что даже есть параллельные запросы, вы гарантированно получите уникальный ключ без конфликтов.
но mongodb не реализует этот механизм изначально, они показывают вам, как сделать его. Они предоставляют только _id для использования в качестве уникального ключа документа. Надеюсь, это прояснит ваш подход.
чтобы расширить эту идею, продолжайте и добавьте, что монго предложил реализацию в вашу определенную модель Мангуста, и, как вы уже догадались, используйте ее в Pre-save или еще лучше pre-init event, чтобы убедиться, что вы всегда генерируете идентификатор, если вы работаете со стороной сервера коллекции, прежде чем сохранить его в монго.