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文档,但找不到或不知道是否有任何方法可以做到这一点?
您可以$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)
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |