【问题标题】:Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in排序超出了 104857600 字节的内存限制,但没有选择外部排序。中止操作。通过 allowDiskUse:true 选择加入
【发布时间】:2019-06-26 16:27:48
【问题描述】:

排序超出了 104857600 字节的内存限制,但未选择外部排序。中止操作。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    如图所示,您需要将 {allowDiskUse : true} 传递给 mongo。只需将其附加到查询的末尾即可。

    db.collection.aggregate([
                         ...
                        ],
                         {
                           allowDiskUse: true
                         }
                        );
    

    【讨论】:

    • 注意:它不适用于 mongodb.com 免费服务:“Aggregation Atlas M0 Free Tier 集群不支持聚合命令或其辅助方法的 allowDiskUse 选项。”
    【解决方案2】:

    如果你使用猫鼬,试试这个:

    await Model.aggregate([{ $match: { foo: 'bar' } }]).allowDiskUse(true);
    

    documentation

    【讨论】:

      【解决方案3】:

      对于看到此内容的具有 SQL 背景的人。我们通常将“ORDER BY”子句放在查询的末尾。我本能地把我的“排序”子句放在了聚合的最后一部分。

      使用 Mongo 聚合,我认为优化器智能地移动“排序”子句的摆动空间更小。因此,如果在逻辑上它适用于您的查询,则将“排序”子句放在顶部,并结合索引,您可以优化解决问题的方法。

      [
         {$match: ...},
         {$project: ...},
         {sort: {time: -1}},
      ]
      
      =>
      
      [
         {sort: {time: -1}},
         {$match: ...},
         {$project: ...}
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 2023-03-20
        • 2013-04-25
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多