在 "mongosh" 中,如何删除所有数据库而不删除典型的 "admin"、"config" 或 "local" 数据库?

In "mongosh", how do I delete all databases without deleting the typical "admin", "config", or "local" databases?

我想做什么?

我编写了一个名为 deleteDatabases.js 的脚本,它应该在 mongosh 中删除所有数据库(除了“admin”、“config”或“local”)。我无法访问 mongo,只能访问 mongosh.

当前尝试执行此操作的代码是什么?

deleteDatabases.js

Mongo().getDBNames().forEach(function(x) {
  if (['admin', 'config', 'local'].indexOf(x) < 0) {
    Mongo().getDB(x).dropDatabase();
  }
})

里面 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

在我成功删除这些数据库之前所做的是:

> db = db.getSiblingDB("database1")
database1
> db.dropDatabase()
{ ok: 1, dropped: 'database1' }
# Repeat for each database I want deleted.

我期望结果是什么?

我希望删除除“admin”、“config”或“local”之外的所有数据库。

实际结果如何?

如上,有一个TypeError

我认为可能是什么问题?

  1. 我使用的 mongosh 版本已过时,这些方法尚未实现或根本没有实现。
  2. 我的 .js 文件实现不正确。

想知道是否有替代方案我仍然使用 mongosh 除非我必须使用其他东西。

编辑:

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()})

这是我正在使用的修复程序,但我希望 .map() 能够正常工作,这样我就可以在 运行 Joe 所说的命令后看到输出。

使用 listDatabases 管理命令,map 只获取数据库名称,filter 删除不需要的:

db.adminCommand("listDatabases").databases.
   map(d => d.name).
   filter(n => ["admin", "config", "local"].indexOf(n) == -1 ).
   map(n => db.getSiblingDB(n).dropDatabase())

请注意,如果您使用 map 而不是 forEach,您将收到关于哪些数据库已成功删除的确认信息,例如

[
  { ok: 1, dropped: 'test' },
  { ok: 1, dropped: 'test1' },
  { ok: 1, dropped: 'test2' }
]