What am I trying to do?
I wrote a script called deleteDatabases.js
and it’s supposed to delete all databases (besides “admin”, “config”, or “local”) when inside mongosh
. I do not have access to mongo
, only mongosh
.
What is the code that currently tries to do that?
deleteDatabases.js
Mongo().getDBNames().forEach(function(x) { if (['admin', 'config', 'local'].indexOf(x) < 0) { Mongo().getDB(x).dropDatabase(); } })
Inside mongosh
:
$ mongosh ... Using MongoDB: 4.4.1 Using Mongosh Beta: 0.4.0 > show dbs admin 184 kB config 36.9 kB database1 283 kB database2 420 kB database3 1337 kB local 90.1 kB > .load /deleteDatabases.js ... (Code from deleteDatabases.js) ... TypeError: (intermediate value).getDBNames is not a function
Before what I did to successfully delete these databases was:
> db = db.getSiblingDB("database1") database1 > db.dropDatabase() { ok: 1, dropped: 'database1' } # Repeat for each database I want deleted.
What do I expect the result to be?
I expect all the databases to be deleted besides “admin”, “config”, or “local”.
What is the actual result?
As above, there’s a TypeError
.
What I think the problem could be?
- The version of
mongosh
I’m using is out of date and does not have those methods implemented yet or at all. - My
.js
file is implemented incorrectly.
Was wondering if there was an alternative where I still use mongosh
unless I have to use something else.
EDIT:
deleteDatabases.js
db.adminCommand( { listDatabases: 1 } ).databases. map(database => database.name). filter(name => ["admin", "config", "local"].indexOf(name) == -1). forEach(function(name){db.getSiblingDB(name).dropDatabase()})
This is the fix that I’m using, but would love the .map()
to work so I can see an output after running the command as spoken by Joe.
Advertisement
Answer
Use the listDatabases admin command, map
to get just the database name, and filter
to eliminate the ones you don’t want:
db.adminCommand("listDatabases").databases. map(d => d.name). filter(n => ["admin", "config", "local"].indexOf(n) == -1 ). map(n => db.getSiblingDB(n).dropDatabase())
Note that if you use map
instead of forEach
you will get back a confirmation of which databases were dropped successfully, like
[ { ok: 1, dropped: 'test' }, { ok: 1, dropped: 'test1' }, { ok: 1, dropped: 'test2' } ]