¿Qué estoy tratando de hacer?
Escribí un script llamado deleteDatabases.js y se supone que debe eliminar todas las bases de datos (además de "admin", "config" o "local") cuando esté dentro mongosh . No tengo acceso a mongo , solo mongosh .
¿Cuál es el código que actualmente intenta hacer eso?
deleteDatabases.js
Mongo().getDBNames().forEach(function(x) { if (['admin', 'config', 'local'].indexOf(x) < 0) { Mongo().getDB(x).dropDatabase(); } }) mongosh interior:
$ 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 functionAntes, lo que hice para eliminar con éxito estas bases de datos fue:
> db = db.getSiblingDB("database1") database1 > db.dropDatabase() { ok: 1, dropped: 'database1' } # Repeat for each database I want deleted.¿Cuál espero que sea el resultado?
Espero que se eliminen todas las bases de datos además de "admin", "config" o "local".
¿Cuál es el resultado real?
Como arriba, hay un TypeError .
¿Cuál creo que podría ser el problema?
mongosh que estoy usando está desactualizada y no tiene implementados esos métodos todavía o en absoluto..js está implementado incorrectamente. Me preguntaba si había una alternativa en la que sigo usando mongosh a menos que tenga que usar otra cosa.
EDITAR:
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()}) Esta es la solución que estoy usando, pero me encantaría que .map() funcione para poder ver una salida después de ejecutar el comando como lo dijo Joe.
Use el comando de administración listDatabases , map para obtener solo el nombre de la base de datos y filter para eliminar las que no desea:
db.adminCommand("listDatabases").databases. map(d => d.name). filter(n => ["admin", "config", "local"].indexOf(n) == -1 ). map(n => db.getSiblingDB(n).dropDatabase()) Tenga en cuenta que si usa el map en lugar de forEach , obtendrá una confirmación de qué bases de datos se eliminaron con éxito, como
[ { ok: 1, dropped: 'test' }, { ok: 1, dropped: 'test1' }, { ok: 1, dropped: 'test2' } ]