With some applications, there may be a need to pull data from other database instances, or from other databases within the same instance. Often this can be achieved by having multiple connections from your application pointing to each of these data sources. This is great for this one application, but if there is a need to do this within the database instance or for stored procedures or views then we will generally use full part naming convention in RDMS world.
For example, SQL Server offers the functionality to reference objects within the database you are working or to reference objects in another database or even a different instance of SQL Server. This is referred to as four-part naming. The reason for this name is that there can be four parts that are used to reference the object as the following shows:
server.database.schema.object
or we can also reference the database that the object resides in such as
select * from master.dbo.sysdatabases
A similar approach in MongoDB is to use db.getSiblingDB()
database method and looping for each database. This is loosely analogous to the undocumented Stored Procedure in SQL Server called sp_MSforeachdb which is quite handy when you do not want to use cursors. You can use db.getSiblingDB()
as an alternative to the use
helper. This is particularly useful when writing scripts using the mongo
shell where the use
helper is not available. To expand on that, I have written a simple script that will loop through all the databases with the instance and then use db.getCollectionNames() method to access Collections within each database.
- Main Code –
var sleepBetweenDBs = sleepBetweenDBs || 400; var sleepBetweenBatches = sleepBetweenBatches || 1000; var batchsize = batchsize || 50 var _dbsPath = "/path_to_dblist/db_list.js" // LIST DBs load(dbsPath) var dbsToProcess = JSON.parse(dbs); dbcount = dbsToProcess.length print ("Database count " + dbcount) print("Databases being processed in this run are as below - ") printjson(dbsToProcess) // Main script entry dbsToProcess.forEach(function(database) { db = db.getSiblingDB(database); if (db != 'local' && db !='admin') { var collections = db.getCollectionNames(); print('Collections inside the db:'); for(var i = 0; i < collections.length; i++) { var name = collections[i]; if(name.substr(0, 6) != 'system' ) // Write your own query here. // Prints the count of documents inside each collection print(db + ' | ' + name + ' | ' + db[name].count()); } } });
- Executing the above script –
You can directly call the .js file from mongo shell as below, and mongo will execute the JavaScript directly.
- Example –
mongo.exe -u username -p password server[:port]/AdminDB --eval "var sleepBetweenBatches=1000" main.js<span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>
- Git Repository –