A powerful Mongoose wrapper for multi-database support, automatic failover, routing, deduped inserts, parallel reads, snapshots, event hooks, and more.
Use multi-mongoose
when:
- You want to connect to multiple MongoDB databases
- You want write failover support if a DB fails
- You need dynamic write routing by region, tenant, etc.
- You want to read from all databases in parallel
- You need safe insert logic across all DBs
- You want built-in stats, snapshots, and event hooks
Feature | Mongoose | multi-mongoose ✅ |
---|---|---|
Multiple DB connections | ❌ Manual | ✅ Built-in |
Automatic write failover | ❌ No | ✅ Yes |
Smart write routing | ❌ No | ✅ Yes |
Read from all DBs | ❌ No | ✅ Yes |
Shared schemas | ❌ No | ✅ Yes |
Safe insert (no duplicates) | ❌ No | ✅ Yes |
Global plugin support | ❌ Limited | ✅ Yes |
Per-DB stats/snapshot | ❌ No | ✅ Yes |
Query rate limiting | ❌ No | ✅ Yes |
npm i a2-mongoose-multi-db
Connect to several MongoDB databases at once, each with a unique name.
await multiMongoose.init([
{ name: 'us', uri: 'mongodb://localhost:27017/usdb' },
{ name: 'eu', uri: 'mongodb://localhost:27017/eudb' }
]);
If a write fails on one DB, it automatically retries on others.
await multiMongoose.init([...], { retryOnFail: true, maxRetries: 2 });
// If 'us' DB is down, write will retry on 'eu' DB.
await User.create({ email: 'failover@example.com' });
Route writes to a DB based on your own logic (e.g., by region or tenant).
multiMongoose.setWriteRouter((model, doc) => doc.region === 'eu' ? 'eu' : 'us');
await User.create({ email: 'bob@eu.com', region: 'eu' }); // Goes to 'eu' DB
Read from all databases in parallel and merge results.
const allUsers = await User.find({}); // Returns users from all DBs
Register a model once and use it across all databases.
const userSchema = new mongoose.Schema({ name: String, email: String });
const User = multiMongoose.model('User', userSchema);
Insert a document only if it does not exist in any DB.
await User.safeInsert({ email: 'unique@example.com' }); // Only inserts if not found in any DB
Apply Mongoose plugins to all models in all DBs.
multiMongoose.usePlugin(require('mongoose-timestamp'));
const User = multiMongoose.model('User', userSchema); // All DBs get the plugin
Get stats for each DB or snapshot all documents to a file.
const stats = await User.getStats();
console.log(stats); // { us: { connected: true, docCount: 10 }, ... }
await User.snapshot('./all-users.json'); // Saves all docs from all DBs
Limit the number of queries per second per DB.
multiMongoose.setQueryLimit({ perSecond: 10 }); // Max 10 queries/sec per DB
Category | Examples | Supported? |
---|---|---|
Read Queries | find, findOne, findById, countDocuments, aggregate | ✅ Yes (runs across all DBs) |
Write Queries | save, create, insertMany, updateOne, updateMany, replaceOne, deleteOne, deleteMany | ✅ Yes (on selected write DB) |
Query chaining | Model.find().sort().limit().select() | ✅ Yes |
Mongoose middleware/hooks | pre, post, lifecycle hooks | ✅ Yes |
Schema methods & statics | schema.methods.xyz, Model.staticFn() | ✅ Yes |
Population (populate) | Model.find().populate('ref') | ✅ Yes |
Validation | Custom schema validators, required, etc. | ✅ Yes |
Plugins | schema.plugin() | ✅ Yes (globally or per-schema) |
Aggregation pipeline | .aggregate([ ... ]) | ✅ Yes (reads from all DBs) |
Transactions (future support) | session.startTransaction() | 🚧 Not supported (yet) |
Lean queries | find().lean() | ✅ Yes |
Timestamps | timestamps: true | ✅ Yes |
Discriminators | Model.discriminator() | ✅ Yes |
Virtuals | schema.virtual('fullName') | ✅ Yes |