在 MongoDB 中删除多个文档的有效方法
Efficient way to delete multiple documents in MongoDB
在我的 PostgresDB 中,我正在使用另一个 table 执行删除操作,如下所示。
DELETE FROM user_records
USING to_delete_records
WHERE user_records.record_id = to_delete_records.record_id
user_records
table 包含大约 2 亿条记录,而 to_delete_records
table 包含大约 5-10 万条记录。 to_delete_records
table 每天都会更新一组新的记录,并且必须执行上述删除操作。 (与删除类似,插入操作(约 5-1000 万条记录)也发生,因此 user_records
的总数据集保持在 2 亿左右)
现在我用 MongoDB 替换 PostgresDB,下面是我用来删除 user_records
集合中的记录的脚本:
db.to_delete_records.find({}, {_id: 0}).forEach(function(doc){
db.user_records.deleteOne({record_id:doc.record_id});
});
由于这是一个循环 运行,似乎效率不高。
在Mongo中使用另一个集合删除一个集合的文档有更好的方法吗?
如果record_id
在user_records
和to_delete_records
中都是唯一字段,如果还没有为每个集合的字段建立唯一索引
db.user_records.createIndex({record_id: 1}, {unique:true});
db.to_delete_records.createIndex({record_id: 1}, {unique:true});
之后,可以根据to_delete_records
[=22=中的内容,使用$merge
语句在集合user_records
中添加一个辅助字段toDelete
]
db.to_delete_records.aggregate([
{
"$merge": {
"into": "user_records",
"on": "record_id",
"whenMatched": [
{
$set: {
"toDelete": true
}
}
]
}
}
])
最后 运行 deleteMany
user_records
db.user_records.deleteMany({toDelete: true});
在我的 PostgresDB 中,我正在使用另一个 table 执行删除操作,如下所示。
DELETE FROM user_records
USING to_delete_records
WHERE user_records.record_id = to_delete_records.record_id
user_records
table 包含大约 2 亿条记录,而 to_delete_records
table 包含大约 5-10 万条记录。 to_delete_records
table 每天都会更新一组新的记录,并且必须执行上述删除操作。 (与删除类似,插入操作(约 5-1000 万条记录)也发生,因此 user_records
的总数据集保持在 2 亿左右)
现在我用 MongoDB 替换 PostgresDB,下面是我用来删除 user_records
集合中的记录的脚本:
db.to_delete_records.find({}, {_id: 0}).forEach(function(doc){
db.user_records.deleteOne({record_id:doc.record_id});
});
由于这是一个循环 运行,似乎效率不高。
在Mongo中使用另一个集合删除一个集合的文档有更好的方法吗?
如果record_id
在user_records
和to_delete_records
中都是唯一字段,如果还没有为每个集合的字段建立唯一索引
db.user_records.createIndex({record_id: 1}, {unique:true});
db.to_delete_records.createIndex({record_id: 1}, {unique:true});
之后,可以根据to_delete_records
[=22=中的内容,使用$merge
语句在集合user_records
中添加一个辅助字段toDelete
]
db.to_delete_records.aggregate([
{
"$merge": {
"into": "user_records",
"on": "record_id",
"whenMatched": [
{
$set: {
"toDelete": true
}
}
]
}
}
])
最后 运行 deleteMany
user_records
db.user_records.deleteMany({toDelete: true});