我应该如何有效地从 mongodb 集合中删除大量记录?

Jie*_*eng 8 mongodb

我正在使用 Mongo 来存储多租户数据。作为租户数据清理的一部分,我想删除与租户相关的所有内容。tenantId 已建立索引,但行数很多,查询需要很长时间,而且我没有简单的方法来获取进度。

目前我做某事

db.records.deleteMany({tenantId: x})
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

考虑批量执行,但就像查询 x 记录,然后构建要删除的 id 列表。看起来非常手动,但这是推荐的方式吗?

ker*_*ter 4

性能可能取决于各种不同的因素。但您可以尝试以下一些选项来提高性能

批量操作

批量操作可能会有所帮助。是针对大量操作进行优化bulk.find(query).remove()的版本。db.collection.remove(query)你可以在这里读更多关于它的内容

您可以使用以下方式:

声明一个搜索查询:

var query= {tenantId: x};
Run Code Online (Sandbox Code Playgroud)

初始化并使用批量:

var bulk = db.yourCollection.initializeUnorderedBulkOp()
bulk.find(query).remove() // or try delete() instead of remove()
bulk.execute()
Run Code Online (Sandbox Code Playgroud)

这里的想法不是为了加速移除,而是为了产生更少的负载。


你也可以尝试bulkWrite()

db.yourCollection.bulkWrite([
   { deleteMany: {
      "filter" : query,
   }}
])
Run Code Online (Sandbox Code Playgroud)

TTL索引

它可能不适合您的用例,但完全有另一种方法,无需您自行删除。

如果您适合根据时间戳删除数据,那么TTL 索引可能会对您有所帮助。这里的想法是,当 TTL 过期时,记录将被删除。

TTL 集合作为一种特殊的索引类型实现,可以将数据存储在 MongoDB 中,并让 mongod 在指定时间段后自动删除数据。