De acuerdo con este artículo de mongodb , es posible incrementar automáticamente un campo y me gustaría usar la forma de recopilación de contadores.
El problema con ese ejemplo es que no tengo miles de personas escribiendo los datos en la base de datos usando la consola mongo. En cambio, estoy tratando de usar mangosta.
Así que mi esquema se parece a esto:
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; } } });Creé la colección de contadores en la misma base de datos y agregué una página con el _id de 'entityId'. A partir de aquí, no estoy seguro de cómo usar mongoose para actualizar esa página y obtener el número incremental.
No hay un esquema para los contadores y me gustaría que siguiera siendo así porque esta no es realmente una entidad utilizada por la aplicación. Solo debe usarse en los esquemas para incrementar automáticamente los campos.
Aquí hay un ejemplo de cómo puede implementar un campo de incremento automático en 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(); }); });Puede usar el paquete mongoose-auto-increment de la siguiente manera:
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); Solo necesita inicializar el autoIncrement una vez.
La respuesta más votada no funciona. Esta es la solución:
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; }); });Los parámetros de opciones le dan el resultado de la actualización y crea un nuevo documento si no existe. Puedes consultar aquí el documento oficial.
Y si necesita un índice ordenado, consulte este documento