通过删除集合并重新创建架构从 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
谢谢,
尼哈
当我想从我的 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
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
谢谢, 尼哈