mongorestore将现有数据库复制/克隆到新数据库失败



我在Windows 10 Pro上运行的PC上安装了MongoDB 5.0.7版本的默认位置。我有一个名为mydb的数据库,其中包含一个名为products的集合。我想复制mydb数据库到一个名为newdb的新数据库。为此,我尝试使用这里提到的mongodumpmongorestore命令。这样做时,虽然mongodump正在正确地执行和创建转储文件,但mongorestore命令每次生成重复密钥错误时都失败。.

将mydb数据库转储到存档文件中的命令:

mongodump --archive="mongodump-mydb" --db=mydb

用于将数据库从转储恢复到新数据库的命令:

mongorestore --archive="mongodump-mydb" --nsFrom='mydb.*' --nsTo='newdb.*'

我得到的错误信息:

2022-04-17T19:09:04.136+0530    preparing collections to restore from
2022-04-17T19:09:04.146+0530    reading metadata for mydb.products from archive 'mongodump-mydb'
2022-04-17T19:09:04.150+0530    restoring to existing collection mydb.products without dropping
2022-04-17T19:09:04.157+0530    restoring mydb.products from archive 'mongodump-mydb'
2022-04-17T19:09:04.209+0530    continuing through error: E11000 duplicate key error collection: mydb.products index: _id_ dup key: { _id: ObjectId('625974fe025923931b6e5e7f') }
2022-04-17T19:09:04.211+0530    continuing through error: E11000 duplicate key error collection: mydb.products index: _id_ dup key: { _id: ObjectId('62597508025923931b6e5e80') }
2022-04-17T19:09:04.211+0530    continuing through error: E11000 duplicate key error collection: mydb.products index: _id_ dup key: { _id: ObjectId('62597508025923931b6e5e81') }
2022-04-17T19:09:04.211+0530    finished restoring mydb.products (0 documents, 3 failures)
2022-04-17T19:09:04.211+0530    no indexes to restore for collection mydb.products
2022-04-17T19:09:04.211+0530    0 document(s) restored successfully. 3 document(s) failed to restore.

令人惊讶的是,它似乎恢复了mydb数据库中的收集产品,而不是newdb。由于mydb已经包含具有唯一id的文档行的产品集合,因此它正在创建冲突,生成重复键错误.

作为替代方案,在执行mongorestore时,我将新数据库的名称放在--nsFrom--nsTo参数中,以检查它是否有一些差异:

mongorestore --archive="mongodump-mydb" --nsFrom='newdb.*' --nsTo='newdb.*'

但是,它产生相同的错误。

不知何故,mongo似乎完全忽略了新的database参数。为什么会发生这种情况,我该如何解决这个问题?因为,将现有数据从数据库复制到新数据库是我的项目的常见需求,如果我不能从转储中恢复数据,那么只需要崩溃就可以永远丢失记录。所以请帮我解决这个问题。

我找到原因了。问题在于在传递--nsFrom--nsTo参数的值时使用单引号。在执行此操作时,在某些环境中,mongo会继续将转储恢复到现有数据库而不是新数据库,从而在现有数据和要恢复的数据之间产生冲突,从而产生"重复键错误"。当您遇到这种情况时,要么使用双引号来传递--nsFrom--nsTo参数的值,要么根本不使用任何引号。

这肯定是MongoDB服务器系统或其语法中的错误。MongoDB开发团队必须注意到这一点,并在下次更新中纠正它。

最新更新