我有这样的文件:
{
"_id" : ObjectId("588e505fcdefc41e84c184cb"),
"Id" : 58614891,
"modifyDate" : 1485567717000,
"data" : [
{
"id" : 99,
"stats" : {
"totalDepth" : 4,
"totalSpeed" : 2,
"totalLostSessions" : 2,
"KDI" : 8,
}
},
{
"id" : 18,
"stats" : {
"totalDepth" : 2,
"totalSpeed" : 1,
"totalLostSessions" : 1,
"KDI" : 2,
}
}
],
"timestampPull" : 1485721695291,
"region" : "eu",
"Status" : 200
}
{
"_id" : ObjectId("588e5060cdefc41e84c184cd"),
"Id" : 38004043,
"modifyDate" : 1485515118000,
"data" : [
{
{
"id" : 18,
"stats" : {
"totalDepth" : 5,
"totalSpeed" : 3,
"totalLostSessions" : 2,
"KDI" : 14,
}
},
{
"id" : 62,
"stats" : {
"totalDepth" : 1,
"totalSpeed" : 0,
"totalLostSessions" : 1,
"KDI" : 1,
}
},
{
"id" : 0,
"stats" : {
"totalDepth" : 155,
"totalSpeed" : 70,
"totalLostSessions" : 85,
"KDI" : 865,
}
}
],
"timestampPull" : 1485721696025,
"region" : "na",
"Status" : 200
}
如果"数据"我想计算每个统计数据的平均值。 id匹配。
{
"id" : 99,
"stats" : {
"totalDepth" : 4,
"totalSpeed" : 2,
"totalLostSessions" : 2,
"KDI" : 8,
}
},
{
"id" : 18,
"stats" : {
"totalDepth" : 3.5,
"totalSpeed" : 2,
"totalLostSessions" : 1.5,
"KDI" : 8,
}
} ...
可以在mongoDB上执行此类操作吗?我可以轻松地将每个数据提取到应用程序并在那里进行平均,但这并不是很有效。
答案 0 :(得分:1)
您可以尝试以下聚合。
$unwind
data
数组。
$group
id
并计算值$avg
和count
到$sum
值的数量。
$match
将count
gt
的数据保持为1. {/ p>
db.collection.aggregate({
$unwind: "$data"
}, {
$group: {
_id: "$data.id",
count: {
$sum: 1
},
"totalDepth": {
$avg: "$data.stats.totalDepth"
},
"totalSpeed": {
$avg: "$data.stats.totalSpeed"
},
"totalLostSessions": {
$avg: "$data.stats.totalLostSessions"
},
"KDI": {
$avg: "$data.stats.KDI"
}
}
}, {
$match: {
count: {
$gt: 1
}
}
})