README
@safer-bwd/mongoose-autonumber
A Mongoose plugin that adds support for auto-increment or auto-number fields to a Mongoose schema. The plugin supports numbering inside groups and periods.
Install
npm install @safer-bwd/mongoose-autonumber --save
Options
counterNamestring The Mongoose model name for storing counters (optional, default__Counter)
Settings
The plugin adds an option autonumber for String or Number schema types.
autonumber(boolean | Object) (optional, defaultfalse)autonumber.numeratorstring The counter name (optional)autonumber.group(string | Function) The path to a Mongoose document grouping property or function to calculate the group (optional)autonumber.periodstring The periodicity of numbering. Used only with autonumber.date (optional, available valuesyear,month,day,hour,minute)autonumber.date(string | Function) The path to a Mongoose document date property or function to calculate the date. Used only with autonumber.period (optional)autonumber.prefix(string | Function) The path to a Mongoose document prefix property or function to calculate the prefix. Used only with String schema type (optional)autonumber.addLeadingZerosboolean The flag, If true then leading zeros are added. Used only with String schema type andmaxlengthschema type option (optional)
Usage
The number is set automatically when a new document is saved.
Important:
By default, the plugin does not make auto number fields immutable.
But you can use schema type option immutable.
Auto increment
import autoNumberPlugin from '@safer-bwd/mongoose-autonumber';
const schema = new mongoose.Schema({
number: {
type: Number,
immutable: true,
autonumber: true,
}
});
schema.plugin(autoNumberPlugin);
const Order = mongoose.model('Order', schema);
const order1 = new Order();
await order1.save(); // number => 1
const order2 = new Order();
await order2.save(); // number => 2
Increment inside group
import autoNumberPlugin from '@safer-bwd/mongoose-autonumber';
const schema = new mongoose.Schema({
customer: String,
immutable: true,
number: {
type: Number,
autonumber: {
group: doc => doc.customer
}
}
});
schema.plugin(autoNumberPlugin);
const Order = mongoose.model('Order', schema);
const order1 = new Order({ customer: 'A' });
await order1.save(); // number => 1
const order2 = new Order({ customer: 'A' });
await order2.save(); // number => 2
const order3 = new Order({ customer: 'B' });
await order3.save(); // number => 1
Increment inside period
import autoNumberPlugin from '@safer-bwd/mongoose-autonumber';
const schema = new mongoose.Schema({
period: Date,
number: {
type: Number,
immutable: true,
autonumber: {
period: 'year',
date: doc => doc.period
}
}
});
schema.plugin(autoNumberPlugin);
const Order = mongoose.model('Order', schema);
const order1 = new Order({ period: new Date(2019, 0, 1) });
await order1.save(); // number => 1
const order2 = new Order({ period: new Date(2019, 0, 2) });
await order2.save(); // number => 2
const order3 = new Order({ period: new Date(2020, 0, 1) });
await order3.save(); // number => 1
Prefix and adding leading zeros
In this case maxlength = the total number length (prefix + suffix).
If the schema type option maxlength is not set then leading zeros will not be added.
import autoNumberPlugin from '@safer-bwd/mongoose-autonumber';
const schema = new mongoose.Schema({
customer: String,
number: {
type: String,
immutable: true,
maxlength: 6,
autonumber: {
prefix: doc => `${doc.customer}-`,
addLeadingZeros: true
}
}
});
schema.plugin(autoNumberPlugin);
const Order = mongoose.model('Order', schema);
const order1 = new Order({ customer: 'A' });
await order1.save(); // number => 'A-0001'
const order2 = new Order({ customer: 'A' });
await order2.save(); // number => 'A-0002'
const order3 = new Order({ customer: 'B' });
await order3.save(); // number => 'B-0003'