Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/deve-sh/mongoose-dual-writes

Library to bridge the gap between mongoose and the ability to perform dual-writes across clusters.
https://github.com/deve-sh/mongoose-dual-writes

dual-writes mongodb mongoose

Last synced: 5 days ago
JSON representation

Library to bridge the gap between mongoose and the ability to perform dual-writes across clusters.

Awesome Lists containing this project

README

        

# Mongoose Dual Writes

Dual/Replicated Writes are a very important feature that need to work when working on [database migrations that need 0 downtime](https://kiranrao.ca/2022/05/04/zero-downtime-migrations.html).

It's natively hard to do with [Mongoose](https://mongoosejs.com/) and difficult to get right.

Mongoose scopes its Models to a single default connection, you have to explicitly create models everytime you use a second connection. And since most codebases that utilize Mongoose have very tight coupling between them and Mongoose's models, it's not feasible to add a duplicated statement each time you write to the database via Mongoose.

You could use [MongoSync](https://www.mongodb.com/docs/cluster-to-cluster-sync/current/reference/mongosync/) but if you're using shared Atlas Clusters, you're out of luck.

This library bridges those gaps and adds a zero-change MongoDB write replication for codebases reliant on Mongoose! 🌟

> **Note and Warning**: The library uses `mongoose.set('debug')` so if you have any debug statements turned on, this would overwrite them. Please be mindful of that. If you need [debug statements](https://www.mongodb.com/docs/atlas/app-services/triggers/database-triggers/), prefer using MongoDB triggers for your migration.

### Installation

```bash
npm i mongoose-dual-writes
```

### Get Started

```javascript
const MongoDBDualWrites = require('mongoose-dual-writes');

// Make sure your Mongoose default connection is already established.

await MongoDBDualWrites.initialize({
secondaryConnections: [
{
uri: 'mongodb:///',
options: {
...allConnectionOptionsSupportedByMongoose,
enabled: true | false // Optional, can be used to switch off dual-writes via a
}
},
... // as many connections you want to replicate writes to
]
});
```

That's it! The writes falling under the following operations would get transferred automatically:

- `updateOne`
- `updateMany`
- `insertOne`
- `insertMany`
- `replaceOne`
- `replaceMany`
- `deleteOne`
- `deleteMany`
- `findOneAndUpdate`
- `findOneAndInsert`
- `findOneAndDelete`
- `findOneAndRemove`
- `findOneAndReplace`
- `save`

### Issues and Feature Requests

[![File An issue](https://img.shields.io/badge/mongoose%20dual%20writes-File%20an%20issue-orangered)](https://github.com/deve-sh/mongoose-dual-writes/issues/new)