Создайте уникальное поле 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, чтобы убедиться, что вы всегда генерируете идентификатор, если вы работаете со стороной сервера коллекции, прежде чем сохранить его в монго.