我正在使用 Mongo 来存储多租户数据。作为租户数据清理的一部分,我想删除与租户相关的所有内容。tenantId 已建立索引,但行数很多,查询需要很长时间,而且我没有简单的方法来获取进度。
目前我做某事
db.records.deleteMany({tenantId: x})
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
考虑批量执行,但就像查询 x 记录,然后构建要删除的 id 列表。看起来非常手动,但这是推荐的方式吗?
性能可能取决于各种不同的因素。但您可以尝试以下一些选项来提高性能
批量操作可能会有所帮助。是针对大量操作进行优化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 集合作为一种特殊的索引类型实现,可以将数据存储在 MongoDB 中,并让 mongod 在指定时间段后自动删除数据。
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |