【问题标题】:In "mongosh", how do I delete all databases without deleting the typical "admin", "config", or "local" databases?在“mongosh”中,如何删除所有数据库而不删除典型的“admin”、“config”或“local”数据库?
【发布时间】:2021-11-12 17:04:33
【问题描述】:

我想做什么?

我编写了一个名为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 所说的命令后看到输出。

【问题讨论】:

    标签: javascript database mongodb mongo-shell


    【解决方案1】:

    使用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' }
    ]
    

    【讨论】:

    • 我已经尝试过您的代码并收到此错误:MongoshInvalidInputError: Cannot pass a function that calls a Mongosh API method as an argument 想知道我是否可能缺少某些东西。
    • 我在上面的“编辑”中减轻了两个不同区域的错误。它可以工作,但希望 .map() 在脚本的最后一部分工作,以便输出数据库删除确认。
    • 可能是版本问题?我正在使用 mongosh 0.12.0,当我复制粘贴该代码时,它会给出如图所示的输出。
    • 这绝对是一个版本的东西,你是对的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 2020-04-18
    • 1970-01-01
    • 2010-10-04
    • 2016-07-30
    • 2011-02-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多