在实际开发中,使用生成数据处理大量数据时,理重可能会遇到重复数据、复数批量插入等需求。据及践以下是批量一个 MongoDB 实战案例,包括批量生成数据、使用生成数据删除重复数据以及数据去重后的理重索引优化。

1、复数批量插入数据
场景我们需要为某个设备在每月生成一条记录,据及践涉及以下条件:
设备编号在一定范围内。批量每月固定日期生成时间戳。使用生成数据特定字段的理重值在一个范围内随机生成。解决方案利用 MongoDB 的复数批量插入功能,通过 JavaScript 脚本批量生成数据:
插入脚本 复制// 定义设备编号范围 var startDevice = 1001; var endDevice = 1120; // 定义每月时间戳(示例时间) var timestamps = [ NumberLong(1727731200000),据及践 // 2024-10-01 0:00:00 NumberLong(1730323200000), // 2024-11-01 0:00:00 NumberLong(1733001600000) // 2024-12-01 0:00:00 ]; // 批量插入数据 for (var tsIdx = 0; tsIdx < timestamps.length; tsIdx++) { var calcBeginDate = timestamps[tsIdx]; for (var deviceCode = startDevice; deviceCode <= endDevice; deviceCode++) { var randomValue = (Math.random() * (0.9999 - 0.9800) + 0.9800).toFixed(4); // 随机值生成 // 构建文档 var document = { "deviceCode": "D" + deviceCode, // 替换设备编号 "type": "months", "calcTime": calcTime, "type0": NumberLong(0), "type1": NumberLong(0), "type2": NumberLong(0), "type3": NumberLong(0), "type4": NumberLong(0), "flag": "1", "ta": parseFloat(randomValue), // 随机值 "updateTime": NumberLong(Date.now()), "createTime": NumberLong(Date.now()), "_class": "com.example.data.entity.Entity" }; // 插入到集合 db.device_data.insert(document); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40. 注意事项1.执行脚本前,确保集合已存在,批量避免插入失败。
2.生成的随机数范围和设备编号范围可根据实际需求调整。
2、删除重复数据
场景由于多次执行插入脚本,可能导致集合中存在重复数据。重复的WordPress模板定义是:
同一设备在同一个时间点(如每月初)的记录有多条。
解决方案通过 MongoDB 的聚合和删除操作,删除重复数据,仅保留每组中的一条。
删除重复数据的脚本 复制// 删除重复数据,保留每组唯一数据 db.device_data.aggregate([ { $group: { _id: { deviceCode: "$deviceCode", calcBeginDate: "$calcBeginDate" }, duplicateIds: { $push: "$_id" } // 收集所有重复的 _id } }, { $project: { _id: 0, keepId: { $arrayElemAt: ["$duplicateIds", 0] }, // 保留第一个 _id deleteIds: { $slice: ["$duplicateIds", 1, { $size: "$duplicateIds" }] } // 需要删除的 _id } } ]).forEach(function(doc) { // 删除所有多余的 _id if (doc.deleteIds.length > 0) { db.device_data.remove({ _id: { $in: doc.deleteIds } }); } });1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21. 脚本说明1.分组:使用$group按deviceCode和calcBeginDate分组,将重复的_id收集到duplicateIds。
2.数据分离:保留第一条记录的_id(keepId),将其余的标记为需要删除的记录(deleteIds)。
3.删除操作:遍历结果,对deleteIds 中的文档执行删除。
3、站群服务器数据去重后的索引优化
场景在清理数据后,为了避免重复数据再次出现,可以为集合创建唯一索引。
解决方案为deviceCode 和calcBeginDate 创建复合唯一索引,确保每个设备每月只有一条记录。
索引创建脚本 复制db.device_data.createIndex( { deviceCode: 1, calcBeginDate: 1 }, { unique: true } );1.2.3.4.注意事项
1.在创建唯一索引前,必须确保数据中没有重复记录,否则索引创建会失败。
2.索引创建成功后,重复插入相同键值对的操作将会报错。
总结
通过以上方法,可以实现以下目标:
1.批量生成数据:高效插入多条满足特定条件的数据。
2.删除重复数据:清理因脚本多次执行或其他原因导致的重复记录。
3.防止重复数据再次出现:通过创建唯一索引,从数据层面杜绝重复。
在实际操作中,建议先备份数据,确保脚本执行安全可靠。同时,可以将这些脚本封装为工具类或定期任务,进一步提升效率。服务器租用


相关文章

精彩导读


热门资讯
关注我们
