The data elevator mongodb is an easy to use and very flexible utility for migrating data sources based on the NPM module data elevator. The only difference is that data elevator mongodb stores its current migration level in a mongodb database.
Storing the current migration level in a database brings advantages when a project shares its data source with multiple running instances of a project. For example when multiple developers working with one database or the project runs on multiple servers.
STEP 1: Install
npm install data-elevator-mongodb
STEP 2: Construct a new data elevator for the project.
node ./node_modules/data-elevator-mongodb construct
STEP 3: Add a new migration.
node ./data-elevator/elevator add "add phone number to users"
STEP 4: Enter you migration code in the generated floor file.
see: ./data-elevator/floors/
STEP 5: Move the elevator to migrate data.
node ./data-elevator/elevator move top
node ./data-elevator/elevator move ground
node ./data-elevator/elevator move 2
node ./data-elevator/elevator move up 2
node ./data-elevator/elevator move down 3
STEP 6: Use help command to get information about additional commands
node ./data-elevator/elevator help
- levelControllerConfig.collectionName: Name of the collection to store the migration level in
- levelControllerConfig.connectionOptions: Connection options see MongoDb website
- levelControllerConfig.connectionUrl: Url for database connection
const config = {
levelControllerConfig: {
collectionName: "_data_elevator",
connectionOptions: null,
connectionUrl: null
}
}
These migrations use the class MongoClientHelpers, this class provider some easy functions to quickly access you collections and documents.
const MongoClientHelpers = require('data-elevator-mongodb/lib/helpers/mongo-client-helpers');
const async = require('async');
module.exports = {
/**
* Data transformation that need to be performed when migrating the data up
* @param floorWorkerParameters - instance of FloorWorkerParameters
* @param callback(error) - If an error is returned then all the subsequent migration will not be handled
*/
onUp : function(floorWorkerParameters, callback) {
//Get all the documents of a collection in an array
MongoClientHelpers.getDocuments(floorWorkerParameters, 'dataobjects', function(error, database, collection, documents) {
//Iterate through the documents
async.each(documents,
function(document, callback) {
if(document.objectStatus == 1) {
document.objectStatus = 2;
//Update the document
collection.update({"_id": document._id}, document, null, function(error, document) {
return callback(error);
})
} else {
return callback(null);
}
},
function(error) {
MongoClientHelpers.closeDatabase();
return callback(error);
});
});
},
/**
* Data transformation that need to be performed when migrating the data down
* @param floorWorkerParameters - instance of FloorWorkerParameters
* @param callback(error) - If an error is returned then all the subsequent migration will not be handled
*/
onDown : function(floorWorkerParameters, callback) {
MongoClientHelpers.getDocuments(floorWorkerParameters, 'dataobjects', function(error, database, collection, documents) {
async.each(documents,
function(document, callback) {
if(document.objectStatus == 2) {
document.objectStatus = 1;
collection.update({"_id": document._id}, document, null, function(error, document) {
return callback(error);
})
} else {
return callback(null);
}
},
function(error) {
MongoClientHelpers.closeDatabase();
return callback(error);
});
});
}
}
const MongoClientHelpers = require('data-elevator-mongodb/lib/helpers/mongo-client-helpers');
module.exports = {
/**
* Data transformation that need to be performed when migrating the data up
* @param floorWorkerParameters - instance of FloorWorkerParameters
* @param callback(error) - If an error is returned then all the subsequent migration will not be handled
*/
onUp : function(floorWorkerParameters, callback) {
//Get a specific collection
MongoClientHelpers.getCollection(floorWorkerParameters, 'dataobjects', function(error, database, collection) {
const renameFields = {
'statText': 'statusText'
};
//Update all the documents in the collection
collection.update({}, { $rename: renameFields }, {multi: true}, function(error) {
MongoClientHelpers.closeDatabase();
return callback(error);
})
});
},
/**
* Data transformation that need to be performed when migrating the data down
* @param floorWorkerParameters - instance of FloorWorkerParameters
* @param callback(error) - If an error is returned then all the subsequent migration will not be handled
*/
onDown : function(floorWorkerParameters, callback) {
MongoClientHelpers.getCollection(floorWorkerParameters, 'quotes', function(error, database, collection) {
const renameFields = {
'statusText': 'statText'
};
collection.update({}, { $rename: renameFields }, {multi: true}, function(error) {
MongoClientHelpers.closeDatabase();
return callback(error);
})
});
}
}
For further documenation about commands or customizations see data elevator documentation.
- data-elevator (npm, github) - store elevator migration levels in a plain file
- data-elevator-elasticsearch (npm, github) - store elevator migration levels in elasticsearch
- data-elevator-mongodb (npm, github) - store elevator migration levels in mongodb
- data-elevator-mysql (npm, github) - store elevator migration levels in mysql
- data-elevator-postgres (npm, github) - store elevator migration levels in postgres
- data-elevator-sqlite3 (npm, github) - store elevator migration levels in sqlite3