Mongodb组平均数组

Kas*_*sen 5 python arrays mongodb pymongo aggregation-framework

我正在尝试进行PyMongo聚合-数组的$ group平均值,但找不到与我的问题匹配的任何示例。

资料范例

{
    Subject: "Dave",
    Strength: [1,2,3,4]
},
{
    Subject: "Dave",
    Strength: [1,2,3,5]
},
{
    Subject: "Dave",
    Strength: [1,2,3,6]
},
{
    Subject: "Stuart",
    Strength: [4,5,6,7]
},
{
    Subject: "Stuart",
    Strength: [6,5,6,7]
},
{
    Subject: "Kevin",
    Strength: [1,2,3,4]
},
{
    Subject: "Kevin",
    Strength: [9,4,3,4]
}
Run Code Online (Sandbox Code Playgroud)

想要的结果

{
    Subject: "Dave",
    mean_strength = [1,2,3,5]
},
{
    Subject: "Stuart",
    mean_strength = [5,5,6,7]
},
{
    Subject: "Kevin",
    mean_strength = [5,3,3,4]
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这种方法,但是MongoDB会将数组解释为Null吗?

pipe = [{'$group': {'_id': 'Subject', 'mean_strength': {'$avg': '$Strength'}}}]
results = db.Walk.aggregate(pipeline=pipe)

Out: [{'_id': 'SubjectID', 'total': None}]
Run Code Online (Sandbox Code Playgroud)

我查看了MongoDB文档,但找不到或不知道是否有任何方法可以做到这一点?

Ale*_*lex 4

您可以$unwind与 一起使用includeArrayIndex。顾名思义,includeArrayIndex将数组索引添加到输出中。这允许分组依据Subject和数组位置Strength。计算平均值后,需要对结果进行排序以确保秒数$group并将$push结果添加回正确的顺序。最后是$project包含并重命名相关列。

db.test.aggregate([{
        "$unwind": {
            "path": "$Strength",
            "includeArrayIndex": "rownum"
        }
    },
    {
        "$group": {
            "_id": {
                "Subject": "$Subject",
                "rownum": "$rownum"
            },
            "mean_strength": {
                "$avg": "$Strength"
            }
        }
    },
    {
        "$sort": {
            "_id.Subject": 1,
            "_id.rownum": 1
        }
    },
    {
        "$group": {
            "_id": "$_id.Subject",
            "mean_strength": {
                "$push": "$mean_strength"
            }
        }
    },
    {
        "$project": {
            "_id": 0,
            "Subject": "$_id",
            "mean_strength": 1
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

对于您的测试输入,将返回:

{ "mean_strength" : [ 5, 5, 6, 7 ], "Subject" : "Stuart" }
{ "mean_strength" : [ 5, 3, 3, 4 ], "Subject" : "Kevin" }
{ "mean_strength" : [ 1, 2, 3, 5 ], "Subject" : "Dave" }
Run Code Online (Sandbox Code Playgroud)