2

I'm connecting to a remote MongoDB server, importing all of the items from it into a local database, and then clearing it.

Is there a safer and more efficient way to do this?

mongoexport -h 1.2.3.4 -d foo -c bar | mongoimport -d foo -c bar
mongo 1.2.3.4/foo --eval "db.bar.remove()"
mongo 1.2.3.4/foo --eval "db.repairDatabase()"  # To free up disk space

The remote database is much smaller than the one that I'm importing into, so replication doesn't seem like an option.

4

1 回答 1

1

好吧,我想我会首先从使用 mongoexport/mongoimport 切换到使用mongodump/mongorestore。与 mongoexport 不同,Mongodump 更快,并且还将保留所有丰富的 BSON 数据类型。

此外,该命令db.bar.remove()将逐个文档地遍历您的集合文档并删除每个文档。由于您真的想摆脱所有东西,因此您可以通过批发删除整个系列来更快地做到这一点db.bar.drop()。这要快得多。但是,删除集合也会删除您为其构建的任何索引,因此您需要在之后重新创建这些索引。

您不必在每次迁移后运行 db.repairDatabase(),因为 MongoDB 会从删除您的集合中回收释放的空间。您可以做的是使用compacthttp://docs.mongodb.org/manual/reference/command/compact/)对释放的空间进行碎片整理。此外,您可以尝试使用usePowerOf2Sizes该集合的标志,这将有助于 MongoDB 更有效地重用空间(http://docs.mongodb.org/manual/reference/command/collMod/)。

复制不是您想要的。通过复制,我们运行多个服务器,这些服务器都包含相同数据的副本,而不是数据集的子集。这主要用于灾难恢复和故障转移,对您的情况没有帮助。

于 2013-09-20T18:07:29.003 回答