在 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_iduser_recordsto_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});