代码之家  ›  专栏  ›  技术社区  ›  SuperSecretAndNotSafeFromWork

可以在<1秒内通过SQL运行此查询,但聚合MongoDB不能在45分钟内从具有相同索引的相同数据集运行

  •  1
  • SuperSecretAndNotSafeFromWork  · 技术社区  · 7 年前

    我有一个数据集(1100万行),其中包括支付给公司的款项,结构如下:

    id : 12345678,
    company_id : 123456,
    payment_value : 50,
    payer_id: 111111,
    payment_date: "20/01/2017"
    payer_name: "John Smith",
    ...<70ish more columns with mostly blank data>...
    

    有60万个公司ID,我想将其分组,并显示支付总额最高的公司ID

    这是我拥有的mongo shell(db版本:4.0.1)代码:

    db.pay.aggregate([
     {$project: {_id:1, company_id:1, payment_value:1}},
     {$group: {_id: "$company_id", total_value: {$sum: "$payment_value"}}},
     {$sort: {total_value: -1},
     {$limit: 1}],
     {allowDiskUse: true})
    

    它不会在45分钟内运行!我有一个关于公司ID的索引,这看起来像是一个直接的查询

    我把它加载到Postgresdb中并写道:

    SELECT 
    company_id,
    SUM(payment_value)
    FROM payments
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 1
    

    这花了1秒钟。我对mongodb collection和postgres表使用相同的索引方法

    我在这里对MongoDB做了什么错误?

    谢谢你抽出时间

    1 回复  |  直到 7 年前
        1
  •  0
  •   SuperSecretAndNotSafeFromWork    7 年前

    我已经设法在一定程度上提高了性能:

    • 通过在终端中设置ulimits和rlimits来更改MongoDB可用资源的限制 -在聚合查询结束时使用allowdishuse:true