我想用mongo的聚合算個uv,但下麵的命令,如圖:
報錯,aggregation result exceeds maximum document size (16MB)
文檔中提到這個問題如圖, http://docs.mongodb.org/manual/core/aggregation-pipeline-limits/,
請各位幫忙看看
感謝
天蓬老师2017-04-22 09:01:32
資料太多,處理不了。你可以先用 $project 選取下欄位然後再group,
{$project:{
xxx : 1,
yyy : 1,
}
}...
PHPz2017-04-22 09:01:32
文法都是正確的,我在自己的機器上試了以下數據:
> 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
輸入重定向不能省,不然就運行腳本模式了,跟交互模式有些差別。