@debitoor/mongocopy

module for copying the subsets of data between mongo databases

Usage no npm install needed!

<script type="module">
  import debitoorMongocopy from 'https://cdn.skypack.dev/@debitoor/mongocopy';
</script>

README

mongocopy npm version Build Status dependencies Status

Sometimes we need to copy a special set of user data from one environment to another. The module fits nicely when you want to

  • select a set of collections
  • add match criteria to the documents inside
  • specify transform function for documents
  • and get it on other db

example

Assume you have production and staging database. In production db you have

{
    products: [
        {userId: 1, _id: 1, name: 'apple'},
        {userId: 1, _id: 2, name: 'orange'}
    ],
    customers: [
        {userId: 1, _id: 1, name: 'bob'},
        {userId: 1, _id: 2, name: 'rob'},
        {userId: 2, _id: 3, name: 'li'}
    ],
    countries: [
        {_id: 1, code: 'UA'},
        {_id: 2, code: 'ES'},
        {_id: 3, code: 'DK'}
    ],
    files: [..],
    other: [..]
}

You want to copy only a few collections for the user 1, transform the documents inside because of env differences, and also you want some dictionary eg countries

var mongocopy = require('mongocopy');

var opts = {
        uriFrom: 'mongodb://localhost:27017/production',
        uriTo: 'mongodb://localhost:27017/staging',
        data: {
            products: {
                query: {userId: 1},
                transform: function(doc, cb) {
                    doc.name += ' xxl';
                    return cb(null, doc);
                }		
            },
            customers: {
                query: {userId: 1},
                transform: function(doc, cb) {
                    doc.name = 'mr ' + doc.name;
                    return cb(null, doc);
                }
            },
            countries: {}
        },
        dryRun: true, // fake run without inserts, reports docs which are found by given queries
        log: true, // streaming logs, false by default
        ignoreDuplicates: true // continue if duplicate error occured, false by default
    }
};

mongocopy(opts, function(err, report) {
    console.log(arguments);
});

That's it!