Maison  >  Questions et réponses  >  le corps du texte

mongodb - mongos aggregation 执行出错

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

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

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

请各位帮忙看看
感谢

PHP中文网PHP中文网2738 Il y a quelques jours821

répondre à tous(2)je répondrai

  • 天蓬老师

    天蓬老师2017-04-22 09:01:32

    Il y a trop de données à traiter. Vous pouvez utiliser $project pour sélectionner d'abord le champ suivant, puis le regrouper,

    {$project:{
        xxx : 1,
        yyy : 1,
      }
    }...
    

    répondre
    0
  • PHPz

    PHPz2017-04-22 09:01:32

    La syntaxe est correcte. J'ai essayé les données suivantes sur ma machine :

    > 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" }
    

    En plus du match, j'utilise la requête d'agrégation suivante :

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

    Le résultat est correct

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

    Étant donné que le résultat final n'est qu'un seul chiffre, il ne devrait pas y avoir une telle erreur. À des fins de débogage, il est recommandé d'afficher les résultats de chaque étape du pipeline. Ajoutez { $limit: 3 } après l'étape à afficher et exécutez la sortie sans suivre les étapes. S'il y a trop de données et que le résultat est trop lent, ajoutez une limite au début et exécutez-le d'abord sur de petites données.

    S'il n'est pas pratique de le modifier encore et encore et de l'exécuter dans le shell, écrivez-le simplement dans un fichier, dans terminal

    $ mongo < agg_uv.js

    La redirection d'entrée ne peut pas être omise, sinon elle s'exécutera en mode script, ce qui est quelque peu différent du mode interactif.

    répondre
    0
  • Annulerrépondre