MongoDB 批量删除数据脚本:高效清理指定日期前数据
该脚本是一个批量删除 MongoDB 数据库中指定表格中小于某个日期的数据的脚本。具体实现过程为:
- 获取当前时间(jobStartTime)以及需要删除的表格名称(tableName)和截止日期(endTime);
- 将截止日期转换为对应的 objectId 字符串(endObjectIdStr);
- 查询表格中小于截止日期的数据总数(allRows);
- 循环执行批量删除操作,每次删除的数据量为 batch_num。具体操作为:
- 查询指定数量的数据的主键值,并将其放入一个数组中(delete_ids);
- 使用 deleteMany 方法一次性删除数组中所有主键值对应的数据;
- 更新剩余需要删除的数据总数(allRows);
- 输出当前批量删除操作的执行时间(taskStartTime 和 taskEndTime)。
- 输出整个脚本的执行时间(jobEndTime 和 jobStartTime)。
需要注意的是,该代码中的查询操作和批量删除操作是注释掉的,需要根据实际需求进行调整。同时,在实际使用时,需要根据具体情况修改表格名称、截止日期和批量删除的数据量等参数。
// 定义变量
var jobStartTime = new Date();
var tableName = 'abnormal_data_detail';
var endTime = '2023-01-01T00:00:00+08:00';
print('===tableName:', tableName, '\n===endTime:',endTime, '\n');
var endObjectIdStr = Math.floor(new ISODate(endTime).getTime() / 1000).toString(16) + '0000000000000000';
print(endTime, '对应的objectId字符串:',endObjectIdStr, '\n');
print('objectId字符串:', endObjectIdStr, '对应的ObjectId时间:', ObjectId(endObjectIdStr).getTimestamp(), '\n');
// 查看数据
// db.getCollection(tableName).find({'_id': {$lt: ObjectId(endObjectIdStr)}}).sort({'_id': -1}).limit(100);
// db.getCollection(tableName).find({'create_datetime': {$lt: ISODate('2023-01-01T00:00:00+08:00')}}).sort({'create_datetime': -1}).limit(100);
// 小于 endTime 日期的数量
var allRows = db.getCollection(tableName).find({'_id': {$lt: ObjectId(endObjectIdStr)}}).count()
print('total rows:', allRows, '\n');
// 批量删除大小
var batch_num = 2000;
while (allRows > 0) {
if (allRows < batch_num) {
batch_num = allRows;
}
var taskStartTime = new Date();
// 只取出 id字段
var cursor = db.getCollection(tableName).find({'_id': {$lt: ObjectId(endObjectIdStr)}}, {'_id': 1}).sort({'_id': 1}).limit(batch_num);
allRows = allRows - batch_num;
var delete_ids = [];
// 将满足条件的主键值放入到数组中
cursor.forEach(function (each_row) {
delete_ids.push(each_row['_id']);
});
// 通过deleteMany一次删除batch_num条记录。
db.getCollection(tableName).deleteMany({
'_id': {'$in': delete_ids}
}, {w: 'majority'})
var taskEndTime = new Date();
print('single batch delete task cost time:', (taskEndTime.getMilliseconds()-taskStartTime.getMilliseconds())/1000, 's\n');
}
var jobEndTime = new Date();
print('Job Finished. All cost time:', (jobEndTime.getMilliseconds()-jobStartTime.getMilliseconds())/1000, 's\n');
原文地址: https://www.cveoy.top/t/topic/niBp 著作权归作者所有。请勿转载和采集!