mongodb - mongos aggregation 执行出错

 花甲墨者 发布于 2022-10-25 08:39

我想用mongo的聚合算个uv,但下面的命令,如图:

报错,aggregation result exceeds maximum document size (16MB)

文档中提到这个问题如图, http://docs.mongodb.org/manual/core/aggregation-pipeline-limits/

请各位帮忙看看
感谢

2 个回答
  • 语法都是正确的,我在自己的机器上试了以下数据:

    > db.uv.find()
    { "_id" : ObjectId("52a102490e085e51aa153478"), "ip" : "127.0.0.1" }
    { "_id" : ObjectId("52a1024b0e085e51aa153479"), "ip" : "127.0.0.2" }
    { "_id" : ObjectId("52a1024c0e085e51aa15347a"), "ip" : "127.0.0.2" }
    { "_id" : ObjectId("52a1024e0e085e51aa15347b"), "ip" : "127.0.0.3" }
    

    除了match, 我用以下的aggregation查询:

    db.uv.aggregate({
      $group: {
        _id: "$ip",
        uv: {
          $first: 1
        }
      }
    }, {
      $group: {
        _id: "result",
        uv: {
          $sum: "$uv"
        }
      }
    })
    

    结果是正确的

    { "result" : [ { "_id" : "result", "uv" : 3 } ], "ok" : 1 }
    

    因为最终结果只有一个数,不应该有这样的报错。为了debug,建议在pipeline中输出每一步的结果看看。在要输出的步骤后面加上 { $limit: 3 } ,不要之后的步骤,运行输出。如果数据太多,结果太慢,在最开始加个limit,先在小数据跑跑看。

    改来改去再到shell里运行如果不方便,就写到文件里,在terminal

    $ mongo < agg_uv.js

    输入重定向不能省,不然就运行脚本模式了,跟交互模式有些区别。

    2022-10-26 14:42 回答
  • 数据太多,处理不了。你可以先用 $project 选取下字段然后再group,

    {$project:{
        xxx : 1,
        yyy : 1,
      }
    }...
    
    2022-10-26 14:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有