Maison > Questions et réponses > le corps du texte
我想用mongo的聚合算个uv,但下面的命令,如图:
报错,aggregation result exceeds maximum document size (16MB)
文档中提到这个问题如图, http://docs.mongodb.org/manual/core/aggregation-pipeline-limits/,
请各位帮忙看看
感谢
天蓬老师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,
}
}...
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.