如何聚集太大的集合,文件数量超过10亿

时间:2015-04-09 07:49:50

标签: mongodb pymongo

我收到以下错误。当我尝试通过 user_id 汇总或在 user_id

上分享时

failed: exception: aggregation result exceeds maximum document size failed: exception: distinct too big, 16mb cap

我想知道如何在非常大的收藏品下完成我的任务?

数据格式

{
    user_id: "Jack",
    SYMPTOM_1: "flu",
    SYMPTOM_2: "cough",
    SYMPTOM_3: "cancer",
    datetime: "20140101",
}

聚合查询

此查询尝试将用户分组,并将医疗记录的所有症状附加到每个用户

db.medical_records.aggregate([
    {
        "$sort": { "datetime": 1 }
    },
    {
        "$group": {
            "_id": "$user_id",
            "symptom1":{
                "$push": {"symptom": "$SYMPTOM_1" ,"date": "$datetime"}
            },
            "symptom2":{
                "$push": {"symptom": "$SYMPTOM_2" ,"date": "$datetime"}
            },
            "symptom3":{
                "$push": {"symptom": "$SYMPTOM_3" ,"date": "$datetime"}
            },                        
           "first_date": { "$first": "$datetime" },
           "user_id": { "$first": "$user_id" },
           "count": { "$sum": 1 }
        }
    },
    {
        "$project": {
            "user_id": "$user_id",
            "date": "$datetime",
            "symptom1": "$symptom1",
            "symptom2": "$symptom2",
            "symptom3": "$symptom3",
            "count": "$count",
            "_id": 1
        }
    }
],allowDiskUse=true)

预期输出

{u'user_id': u'de96dsdase303c6c6439891c57901183c0e4c',
   u'symptom1': [{u'symptom': u'1479 ', u'date': u'20040910'}],
   u'symptom2': [{u'symptom': u'     ', u'date': u'20040910'}],
   u'symptom3': [{u'symptom': u'     ', u'date': u'20040910'}],
   u'count': 1,
   u'first_date': u'20040910'}

1 个答案:

答案 0 :(得分:-1)

看起来您正在尝试使用allowDiskUse选项,这可能会解决您的问题,但不幸的是您似乎有语法错误。

将选项传递给某个操作时,需要将这些选项作为{}所包围的对象传递。

您在此处执行的操作是将true分配给新的全局变量allowDiskUse,并将该assign操作的结果传递给aggregate,这只是值true

尝试将],allowDiskUse=true)替换为], { allowDiskUse:true } )

这允许您规避每个聚合阶段的16MB限制。但请记住,这仍然是一个非常缓慢的操作。