2014-04-21 18 views
18

Given schematu:tworzyć unikalne pole autoIncrement z mangusta

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

Chcę, aby id wyjątkowy i autoincrement. Próbuję zdać sobie sprawę, mongodb implementation, ale mam problemy ze zrozumieniem, jak to zrobić w mangusta.

Moje pytanie brzmi:: jaki jest właściwy sposób na zaimplementowanie pola autoregulacji w mangunie bez używania wtyczek i tak dalej?

+0

Naprawdę spędzam dużo czasu i próbuję zrobić to samemu. Przepraszam za takie durne pytanie –

+0

Próbowałem zwiększyć identyfikator przed zapisaniem. Ale jak mam pracować z kolekcją liczników? Czy muszę mieć na to schemat? To są pytania, na które nie mogę się dowiedzieć –

Odpowiedz

25

Tutaj jest dobrym przykładem realizacji polach auto-zwiększany za pomocą 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(); 
    }); 
}); 

należy wykonać krok 1 z mongodb documentation po pierwsze.

+0

Nie mogę znaleźć kroku 1 w linku. może to się zmieniło? – Igal

+2

Naprawiłem link. Musisz wstawić wartość początkową do kolekcji "liczników" ({_id: 'entityId', następna: 0}) – edtech

1

Tak, tutaj jest "chudy" na tej funkcji.

Musisz mieć tę kolekcję w swojej bazie danych mongo. Działa jako współbieżna alokacja klucza pojedynczego zapisu prawdy, jeśli chcesz. Przykład Mongo pokazuje, jak wykonać operację "atomową", aby uzyskać następny klucz i upewnić się, że nawet w przypadku równoczesnych żądań, masz zagwarantowany unikalny klucz zwracany bez kolizji.

Ale mongodb nie implementuje tego mechanizmu natywnie, pokazują, jak to zrobić. Zapewniają one tylko _id do wykorzystania jako unikalny klucz dokumentu. Mam nadzieję, że to wyjaśni twoje podejście.

Aby rozwinąć pomysł, dodaj i zasugeruj, że mongo zasugerował implementację do twojego zdefiniowanego modelu Mongoose, a jak już się domyślasz, użyj go w Pre-save lub jeszcze lepszym inicjowaniu zdarzenia, aby upewnić się, że zawsze generujesz identyfikator, jeśli pracujesz z serwerem kolekcji, zanim zapiszesz go w mongo.