Создайте уникальное поле автоинкремента с мангустами

Учитывая схему:

var EventSchema = new Schema({
    id: {
        // ...
    },
    name: {
        type: String
    },
});

Я хочу сделать уникальный id и автоинкремент. Я пытаюсь реализовать реализацию mongodb, но у меня проблемы с пониманием того, как это делается в мангусте.

Мой вопрос: какой правильный способ реализовать поле автоинкремента в мангусте без использования каких-либо плагинов и так далее?

Ответ 1

Вот хороший пример реализации автоматических приращений с использованием Mongoose:

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.

Ответ 2

Да, здесь "тощий" по этой функции.

Вы должны иметь эту коллекцию в своей базе данных mongo. Он действует как одновременное выделение ключевых слов, если вы хотите. Пример Mongo показывает вам, как выполнить "атомную" операцию, чтобы получить следующий ключ и убедиться, что даже при наличии параллельных запросов вам будет гарантирован уникальный ключ, который будет возвращен без коллизий.

Но, mongodb не реализует этот механизм изначально, они показывают вам, как это сделать. Они предоставляют только _id для использования в качестве уникального ключа документа. Надеюсь, это прояснит ваш подход.

Чтобы расширить эту идею, добавьте, что монго предложило реализовать вашу определенную модель Mongoose, и, как вы уже догадались, используйте ее в Pre-save или еще лучше, чем pre-init, чтобы гарантировать, что вы всегда генерируете идентификатор, если вы работаете с на стороне сервера, прежде чем вы сохраните его в монго.

Ответ 4

Игнорируйте все вышесказанное. Вот решение

YourModelname.find().count(function(err, count){
   req["body"].yourID= count + 1;
      YourModelname.create(req.body, function (err, post) {
        if (err) return next(err);
        res.json(req.body);
      });
    });