MongoDB组子对象具有相同的id并获得值的平均值

时间:2017-01-29 22:28:01

标签: mongodb

我有这样的文件:

{
        "_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上执行此类操作吗?我可以轻松地将每个数据提取到应用程序并在那里进行平均,但这并不是很有效。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。

$unwind data数组。

{p} $group id并计算值$avgcount$sum值的数量。

$matchcount 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
        }
    }
})