db.getCollection('monitorlogs_copy').aggregate([
{
$group: {
_id: {
monId: "$monId",
monDbid: "$monDbid",
pubTimestamp: "$pubTimestamp",
getTimestamp: "$getTimestamp"
},
duplicates: { $push: "$_id" },
count: { $sum: 1 }
}
},
{
$match: {
count: { $gt: 1 }
}
}
]).forEach(function(doc) {
doc.duplicates.shift(); // 保留第一个文档,删除其他重复文档
db.getCollection('monitorlogs_copy').remove({_id: {$in: doc.duplicates}});
});
1.$group阶段:使用文档中的monId、monDbid、pubTimestamp和getTimestamp字段作为分组的依据,将具有相同值的文档分为一组。在每个分组中,我们使用$push操作符将重复文档的_id字段添加到名为duplicates的数组中,并使用$sum操作符计算每个组中的文档数量。
2.$match阶段:根据每个组的文档数量count进行筛选,只保留有重复文档的组(count大于1)。
3.forEach方法:对于每个匹配的组,我们使用shift方法从duplicates数组中移除第一个元素(即保留第一个文档),并保留其他重复文档的_id。
4.remove操作:最后,我们使用$in操作符和$remove方法来删除包含在duplicates数组中的重复文档。
在聚合操作中启用磁盘使用选项 allowDiskUse:true,将中间结果写入磁盘而不是完全依赖内存