MongoDB获取考虑文档等级的组的平均值

时间:2016-09-02 11:14:27

标签: mongodb group-by average aggregation-framework rank

我的文件按顺序排列:

{ 
   "_id": "abcde1",
   "value" : 300
},
{ 
   "_id": "abcde2",
   "value" : 200
},
{ 
   "_id": "abcde3",
   "value" : 400
},
{ 
   "_id": "abcde4",
   "value" : 500
},
{ 
   "_id": "abcde5",
   "value" : 600
}

即, 我希望前2个,前4个和所有5个文档的“_id”平均匹配,如单个查询:

{
    "value_2" : 250,   // Average of first 2 documents
    "value_4" : 350,    // Average of first four documents
    "value_5" : 400     // Average of all 5 documents
}

是否可以根据文档的等级对文档进行分组。

我可以在3个单独的查询中完成3个结果。单个查询是否可能?

1 个答案:

答案 0 :(得分:1)

您可以尝试运行以下管道:

db.collection.aggregate([
    // previous pipeline here
    {
        "$group": {
            "_id": null,
            "values": { "$push": "$value" }                
        }
    },
    { "$unwind": { "path": "$values", "includeArrayIndex": "rank"  } },
    {
        "$group": {
            "_id": null,
            "value_2_sum": {
                "$sum": { 
                    "$cond": [
                        { "$lt": ["$rank", 2] },
                        "$values",
                        0
                    ]
                }
            },
            "value_2_count": {
                "$sum": { 
                    "$cond": [
                        { "$lt": ["$rank", 2] },
                        1,
                        0
                    ]
                }
            },
            "value_4_sum": {
                "$sum": { 
                    "$cond": [
                        { "$lt": ["$rank", 4] },
                        "$values",
                        0
                    ]
                }
            },
            "value_4_count": {
                "$sum": { 
                    "$cond": [
                        { "$lt": ["$rank", 4] },
                        1,
                        0
                    ]
                }
            },
            "value_5": { "$avg": "$values" }
        }
    },
    {
        "$project": {
            "value_2" : { "$divide": ["$value_2_sum", "$value_2_count"] },   // Average of first 2 documents
            "value_4" : { "$divide": ["$value_4_sum", "$value_4_count"] },    // Average of first four documents
            "value_5" : 1
        }
    }
])