账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于mongodb 百万级数据 去重 查询优化的问题
    62
    0

    现有一个企业表company,里面有100万的数据,对应一个员工表user,每个企业ID company_id对应0到多条user数据,员工表中有300万条数据;具体结构如下:

    db.company.find()
    {
        "_id" : ObjectId("5a4356fcac671b55711ba0f3"),
        "name":"某某企业"
        "create_time":Timestamp(1510644421, 1)
    }
    ......
    
    db.user.find()
    {
        "_id" : ObjectId("5a4356fcac671b55711ba0f4"),
        "company_id":ObjectId("5a4356fcac671b55711ba0f3"),
        "status":0,
        "username":"小刘"
    },
    {
        "_id" : ObjectId("5a4356fcac671b55711ba0f4"),
        "company_id":ObjectId("5a4356fcac671b55711ba0f3"),
        "status":1,
        "username":"小马"
    }
    

    要找出所有没有员工的企业,包括company表在user里没有对应数据的,以及对应status为0的数据,每页显示十条,应该如何查找效率最快?

    尝试过先找出user表里status里为1的company_id去重后取出一个数组,再用company表的_id去notin这个数组,但是数据里超过百万后,查询需要7s以上。

    db.user.aggregate(
        {'$match':{'status':1}},
        {'$group':{'_id':'$company_id'}}
    );

    请问能够如何优化吗

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 爱人想离我怎挽 普通会员 1楼

      在 MongoDB 中,如果你想查询一个百万级别的数据并进行去重,可以使用以下的查询策略:

      1. 使用 聚合查询:MongoDB 提供了聚合查询功能,可以对数据进行更复杂的数据处理和分析。如果你只需要进行去重,那么可以使用 mapReduceunwind 操作,将 unwind 需要处理的值拆分成多个值,然后进行去重。

      javascript db.collection.aggregate([ { $unwind: "$unwind" }, { $group: { _id: "$unwind._id", uniqueValues: { $push: "$$unwind" }, } } ])

      1. 使用 Cursor:如果你需要对百万级别的数据进行排序和分组,那么可以使用 CursorCursor 是 MongoDB 的一种数据结构,可以提供对数据的快速访问和排序。

      javascript db.collection.find().sort({ age: -1 }).cursor()

      1. 使用索引:MongoDB 提供了多种索引类型,包括 textint32bool 等,这些索引可以大大提高查询性能。如果你的数据主要以文本形式存在,那么可以考虑使用 text 索引。

      2. 使用 $group$sort:如果你的数据主要是以表格形式存在,那么可以考虑使用 $group$sort 进行分组和排序。$group$sort 是 MongoDB 的两个强大的聚合函数,可以让你对数据进行复杂的聚合和排序。

      总的来说,选择哪种查询策略,主要取决于你的具体需求和数据的特性。如果你的数据主要是以表格形式存在,那么 $group$sort 是更好的选择。如果你的数据主要是以文本形式存在,那么 $unwindmapReduceunwind 操作可能更适合你。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部