2014-04-21 5 views
18

Dato uno schema:Crea campo autoincrement unico con mangusta

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

Voglio fare id unico e autoincrement. Provo a realizzare mongodb implementation ma ho problemi a capire come farlo nel mangusta.

La mia domanda è: qual è il modo giusto per implementare il campo di autoincremento in mangusta senza utilizzare alcun plugin e così via?

+0

Trascorro davvero molto tempo e provo a farlo da solo. Scusa per una domanda fittizia –

+0

Ho provato ad incrementare l'id pre-save. Ma come devo lavorare con la collezione di contatori? Devo avere uno schema per questo? Questa è la domanda che non capisco –

risposta

25

Ecco un buon esempio di implementazione campi auto-incrementato utilizzando 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(); 
    }); 
}); 

È necessario eseguire il passaggio 1 da mongodb documentation in primo luogo.

+0

Non riesco a trovare un passaggio 1 nel link. forse è cambiato? – Igal

+2

Ho risolto il collegamento. Devi inserire un valore iniziale nella raccolta "Contatori" ({_id: 'entityId', seq: 0}) – edtech

1

Sì, ecco il "magro" su quella funzione.

È necessario disporre di tale raccolta nel database mongo. Se lo desideri, agisce come un singolo record di verità assegnato simultaneamente. L'esempio di Mongo mostra come eseguire un'operazione "atomica" per ottenere la chiave successiva e assicurarsi che anche in presenza di richieste concorrenti sia garantito che la chiave univoca venga restituita senza collisioni.

Ma, mongodb non implementa questo meccanismo in modo nativo, ti mostrano come farlo. Forniscono solo _id come chiave del documento univoco. Spero che questo chiarisca il tuo approccio.

Per espandere l'idea, andare avanti e aggiungere che mongo ha suggerito l'implementazione per il modello definito Mongoose e come hai già intuito, usalo in Pre-save o ancora prima di un evento pre-init per assicurarti di generare sempre un id se lavori con un lato del server di raccolta prima di salvarlo su mongo.