V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
dtgxx
V2EX  ›  MongoDB

mongodb 唯一索引重复数据问题请教

  •  
  •   dtgxx · 131 天前 · 3202 次点击
    这是一个创建于 131 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们好,我用的 mongodb4.2,目前数据导入进去了,80 亿数据,导了很久。。然后在建联合唯一索引的时候,有数据重复,报错无法创建。。。


    有没有什么好的方法可以建联合唯一索引,删了数据先建索引再重新导,实在太折腾太慢了。。。

    9 条回复    2020-07-22 22:44:08 +08:00
    pupboss
        1
    pupboss   131 天前
    空表先创建索引,再想办法导入,唯一索引重复的就会报错了
    tikazyq
        2
    tikazyq   131 天前
    试一下把组合字段弄成一个组合键放在_id,直接插入就可以了,主键自动去重
    Stypstive
        3
    Stypstive   131 天前
    使用 MongoDB 的 Bulk Operation,每 5 万条插入一次很快的。不要用 save 或 insert 方法,太慢了。
    holajamc
        4
    holajamc   131 天前
    借楼问一下 80 亿的数据查询效率如何呢?
    aborigine
        5
    aborigine   131 天前
    建新表,加索引,旧表导入新表,删旧表
    aborigine
        6
    aborigine   131 天前
    联合唯一不如把唯一索引的字段拼接以后取 hash 后单字段索引去重,有效降低索引大小及去重效率
    Stypstive
        7
    Stypstive   131 天前
    或者找出来重复的数据,删除了,再建索引。

    这是一个查找重复手机号的用户的数据的例子,你可以根据你业务改改。

    var p = [
    {
    $group: {
    _id: '$mobile',
    count: {
    $sum: 1
    }
    }
    },
    {
    $match: {
    count: {
    $gt: 1
    }
    }
    }
    ]

    db.member_user.aggregate(p)
    dtgxx
        8
    dtgxx   131 天前
    谢谢大佬们
    @pupboss @aborigine 确实应该只能重新导了 mongo2.x 的版本还支持一个参数,目前那个参数废弃了
    @tikazyq @aborigine @Stypstive 直接从文件开了 50 个 import 进程导入的,大约 1 秒 40 万条,写代码自定义_id 方式试了一下,插入的性能实在太低了,所以就想建联合唯一索引了。
    @holajamc 目前插入 80 亿数据,因为每条数据字段比较少,占空间 700G 多,根据索引查询延迟在 50-80ms 还可以,就用的单台机器,没分片。
    tikazyq
        9
    tikazyq   131 天前
    @dtgxx 写代码插入肯定没有 native 快,用批量插入可能会快一些
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2175 人在线   最高记录 5268   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 17ms · UTC 16:26 · PVG 00:26 · LAX 08:26 · JFK 11:26
    ♥ Do have faith in what you're doing.