2014-04-21 5 views
18

Учитывая схему:Создать уникальное поле автоинкрементного с мангуста

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

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

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

+0

Я действительно трачу много времени и стараюсь сделать это сам. Извините за такой фиктивный вопрос –

+0

Я попытался увеличить id pre save. Но как я должен работать с коллекцией счетчиков? Должен ли я иметь схему для этого? Это вопросы, которые я не знаю –

ответ

25

Вот хороший пример реализации автоинкрементных полей с использованием Мангуста:

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 documentation, во-первых.

+0

Я не могу найти Шаг 1 в ссылке. Возможно, это изменилось? – Igal

+2

Я исправил ссылку. Вы должны вставить начальное значение в коллекцию счетчиков ({_id: 'entityId', seq: 0}) – edtech

1

Да, вот «тощий» по этой функции.

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

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

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

Смежные вопросы