MongoDB中大型集合文档的快速查询和删除

MongoDB中大型集合文档的快速查询和删除,mongodb,mongodb-query,delete-file,Mongodb,Mongodb Query,Delete File,我有一个收藏(比如CollOne),里面有几百万份文件。它们具有公共字段“id” 我需要按id删除CollOne中的一些文档。这些id存储在另一个集合(CollOne)中的文档中。此ids_to_delete文档的结构如下 {"action_type":"toDelete","ids":[4,8,9,....]} 由于CollOne相当大,查找和删除一个文档将花费相当长的时间。有什么方法可以加快这个过程吗?就像如果你想删除任何东西,就

我有一个收藏(比如CollOne),里面有几百万份文件。它们具有公共字段“id”

我需要按id删除CollOne中的一些文档。这些id存储在另一个集合(CollOne)中的文档中。此ids_to_delete文档的结构如下

{"action_type":"toDelete","ids":[4,8,9,....]}

由于CollOne相当大,查找和删除一个文档将花费相当长的时间。有什么方法可以加快这个过程吗?

就像如果你想删除任何东西,就不能真正避免数据库中的删除操作一样。如果您遇到性能问题,我建议您确保在
id
字段上建立索引,否则Mongo将使用
COLLSCAN
来满足查询,这意味着它将对整个
colLOne
集合进行迭代,我猜这就是您感到痛苦的地方

一旦确保建立了索引,就没有比使用
deleteMany
更有效的方法了

db.collOne.deleteMany({id: {$in: [4, 8, 9, .... ]})
  • 如果您没有索引,并且不知道如何构建索引,则应使用如下方法: (在版本4.2之前,构建索引锁定整个数据库,在大规模情况下,这可能需要几个小时(如果不是更多的话),为了避免这种情况,请使用
    background
    选项)
----编辑----

在Mongo shell中:


Mongo shell是基于javascript的,因此您只需使用js语法执行相同的逻辑,下面是我的做法:

let toDelete = db.collTwo.findOne({ ... })
db.collOne.deleteMany({id: {$in: toDelete.ids}})

感谢您的快速回复!真的节省了我很多时间。我还想知道是否有一种方法可以将[4,8,9,…]字段中的$in替换为对ids_to_delete文档的引用?类似于{$in:colltowo.find({“action_type”:“toDelete”}).field(“ids”)}。我使用Python,因此可以分别查询这两个集合并完成删除工作。但我只是想知道我是否可以用Mongo shell来做这件事。如果这个问题很基本,很抱歉。是的,当然有,您使用的是
pymongo
还是原生的mongo包?我使用的是pymongo。对不起,我没说清楚。我的意思是我知道如何使用pymongo来完成任务(例如,在$in字段中放置一个列表)。但是如何在Mongo shell中实现呢?谢谢MongoShell是基于javascript的,但是您想要执行的“逻辑”保持不变,我将其作为如何在shell中执行这两个命令的示例进行了编辑。
db.collOne.createIndex({id: 1}) 
let toDelete = db.collTwo.findOne({ ... })
db.collOne.deleteMany({id: {$in: toDelete.ids}})