Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose auto increment

According to this mongodb article it is possible to auto increment a field and I would like the use the counters collection way.

The problem with that example is that I don't have thousands of people typing the data in the database using the mongo console. Instead I am trying to use mongoose.

So my schema looks something like this:

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;       }     } }); 

I have created the counters collection in the same database and added a page with the _id of 'entityId'. From here I am not sure how to use mongoose to update that page and get the incrementing number.

There is no schema for counters and I would like it to stay that way because this is not really an entity used by the application. It should only be used in the schema(s) to auto increment fields.

like image 1000
HMR Avatar asked Feb 06 '15 03:02

HMR


People also ask

How to auto increment in 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.

Does Mongoose create ID automatically?

_id field is auto generated by Mongoose and gets attached to the Model, and at the time of saving/inserting the document into MongoDB, MongoDB will use that unique _id field which was generated by Mongoose.

Is MongoDB ID auto increment?

Although MongoDB does not support auto-increment sequence as a default feature like some relational databases, we can still achieve this functionality using a counter collection. The counter collection will have a single document that tracks the current unique identifier value.


2 Answers

Here is an example how you can implement auto-increment field 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();     }); }); 
like image 87
edtech Avatar answered Sep 19 '22 11:09

edtech


You can use mongoose-auto-increment package as follows:

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); 

You only need to initialize the autoIncrement once.

like image 34
moorara Avatar answered Sep 17 '22 11:09

moorara