上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

mongodb数据库文档去重操作

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-7 10:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    5

    回帖

    19

    积分

    助理工程师

    积分
    19
    发表于 2023-7-6 12:26:13 | 显示全部楼层 | 阅读模式

    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,将中间结果写入磁盘而不是完全依赖内存

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    296

    主题

    3923

    回帖

    3843

    积分

    管理员

    积分
    3843

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-7-6 14:45:12 | 显示全部楼层
    哥哥可以用markdown的code功能

    ```js
    你的代码
    ```

    这样代码整洁些
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表