通过删除集合并重新创建架构从 mongodb 集合中删除所有条目的更快方法

Faster way to remove all entries from mongodb collection by dropping collection and recreating schema

当我想从我的 mongoDB 集合中删除所有对象时 comments 我使用以下命令执行此操作:

mongo $MONGODB_URI --eval 'db.comments.deleteMany({});'

但是,当集合中有数百万条记录时,这会非常慢。

在像 Postgres 这样的关系数据库中,我只需复制集合的结构,创建一个 comments2 集合,删除 comments 集合,然后将 comments2 重命名为 comments.

在 MongoDB 中也可以这样做吗? 或者有什么其他的技巧可以加快进度吗?

对于 mongodb 版本 >=4.0,您可以通过 db.comments.renameCollection("comments2") 执行此操作,但这是一种资源密集型操作,对于更大的集合,您最好使用 mongodump/mongorestore。所以最好的行动步骤是:

 mongodump -d x -c comments -out dump.bson
 >use x
 >db.comments.drop()
 mongorestore -d x -c comments2  dump.bson

请注意,deleteMany({}) 是一个资源密集型操作,因为它会为您删除的每个文档创建 oplog 单个条目并传播到所有 replicaSet 成员。

谢谢,答案激发了我自己的解决方案。我忘了 MongoDB 没有像关系数据库这样的模式。

所以我所做的是:

1。转储一个空集合+集合的索引

mongodump --host=127.0.0.1 --port=7001 --db=coral --collection=comments --query='{"id": "doesntexist"}'  --out=./dump

这将创建一个包含内容 comments.bson(空)和 comments.metadata.json

的文件夹 ./dump

2。删除 comments 集合

mongo mongodb://127.0.0.1:7001/coral --eval 'db.comments.drop();'

3。导入新数据 new_comments.json(不同于 comments.bson)

mongoimport --uri=mongodb://127.0.0.1:7001/coral --file=new_comments.json --collection comments --numInsertionWorkers 12

这比先添加索引然后再导入要快得多。

4。向后添加索引

mongorestore --uri=mongodb://127.0.0.1:7001/coral --dir dump/coral --nsInclude coral.comments --numInsertionWorkersPerCollection 12

请注意,--numInsertionWorkers 通过将工作分配给 12 个 CPU 来加快处理速度。 可以在 OSx 上找到你有多少个 CPU:

sysctl -n hw.ncpu

db.cities.aggregate([{ $match: {} }, { $out: "collection2" }]) 如果您可以登录到 mongo 提示符并简单地删除之前的集合。 否则,您发布的方法就是一种方法。

mongoexport.exe /host: /port: /db:test /collection:collection1 /out:collection1.json mongoimport.exe /host: /port: /db:test /collection:collection2 /file:collection1.json

谢谢, 尼哈