Incremento automatico di Mongoose

Secondo questo articolo di mongodb è ansible incrementare automaticamente un campo e mi piacerebbe utilizzare il modo di raccolta dei contatori.

Il problema con quell’esempio è che non ho migliaia di persone che digitano i dati nel database usando la console mongo. Invece sto cercando di usare la mangusta.

Quindi il mio schema assomiglia a qualcosa del genere:

var entitySchema = mongoose.Schema({ testvalue:{type:String,default:function getNextSequence() { console.log('what is this:',mongoose);//this is mongoose var ret = db.counters.findAndModify({ query: { _id:'entityId' }, update: { $inc: { seq: 1 } }, new: true } ); return ret.seq; } } }); 

Ho creato la raccolta di contatori nello stesso database e ho aggiunto una pagina con _id di ‘entityId’. Da qui non sono sicuro di come usare mangusta per aggiornare quella pagina e ottenere il numero crescente.

Non esiste uno schema per i contatori e mi piacerebbe che rimanesse così perché questa non è realmente un’entity framework utilizzata dall’applicazione. Dovrebbe essere usato solo nello schema (s) per incrementare automaticamente i campi.

Ecco un esempio di come è ansible implementare il campo di incremento automatico in 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(); }); }); 

È ansible utilizzare il pacchetto mongoose-auto-increment come segue:

 var mongoose = require('mongoose'); var autoIncrement = require('mongoose-auto-increment'); /* connect to your database here */ /* define your CounterSchema here */ autoIncrement.initialize(mongoose.connection); CounterSchema.plugin(autoIncrement.plugin, 'Counter'); var Counter = mongoose.model('Counter', CounterSchema); 

È necessario solo inizializzare l’ autoIncrement una volta.

La risposta più votata non funziona. Questa è la soluzione:

 var CounterSchema = new mongoose.Schema({ _id: {type: String, required: true}, seq: { type: Number, default: 0 } }); var counter = mongoose.model('counter', CounterSchema); var entitySchema = mongoose.Schema({ sort: {type: String} }); entitySchema.pre('save', function(next) { var doc = this; counter.findByIdAndUpdateAsync({_id: 'entityId'}, {$inc: { seq: 1} }, {new: true, upsert: true}).then(function(count) { console.log("...count: "+JSON.stringify(count)); doc.sort = count.seq; next(); }) .catch(function(error) { console.error("counter error-> : "+error); throw error; }); }); 

I parametri delle opzioni ti danno il risultato dell’aggiornamento e crea un nuovo documento se non esiste. Puoi controllare qui il documento ufficiale.

E se hai bisogno di un indice ordinato, controlla questo documento

So che questo è stato già un sacco di risposte, ma vorrei condividere la mia soluzione che è IMO breve e facile da usare:

 // Use pre middleware entitySchema.pre('save', function (next) { // Only increment when the document is new if (this.isNew) { entityModel.count().then(res => { this._id = res; // Increment count next(); }); } else { next(); } }); 

Assicurati che entitySchema._id abbia type:Number . Versione Mongoose: 5.0.1 .

Uso insieme @ cluny85 e @edtech. Ma non completo finire questo problema.

counterModel.findByIdAndUpdate({_id: 'aid'}, {$inc: { seq: 1} }, function(error,counter){ Ma in funzione “pre (‘save …) quindi risposta del contatore di aggiornamento terminato dopo il salvataggio documento. Quindi non aggiorno il contatore al documento.

Si prega di controllare di nuovo tutte le risposte. Grazie.

Scusate. Non posso aggiungere commenti. Perché sono un principiante.

Le risposte sembrano aumentare la sequenza anche se il documento ha già un campo _id (ordinamento, qualunque sia). Questo sarebbe il caso se si “salva” per aggiornare un documento esistente. No?

Se ho ragione, dovresti chiamare next () se this._id! == 0

I documenti della mangusta non sono molto chiari su questo. Se sta eseguendo internamente una query di tipo update, allora pre (‘save’ potrebbe non essere chiamato.

UNA PRECISAZIONE

Sembra che il metodo pre ‘save’ sia effettivamente chiamato sugli aggiornamenti.

Non penso che tu voglia incrementare inutilmente la tua sequenza. Ti costa una query e spreca il numero di sequenza.