具有数组元素的MongoDB数学运算

时间:2018-07-11 08:19:40

标签: mongodb aggregation-framework

我们收集了以下文件:

{ 
    "_id" : <ObjectId>, 
    "player" : <String>, 
    "params" : [
        ...,
        {
            "name" : "kills", 
            "value" : 10
        },
        {
            "name" : "deaths", 
            "value" : 10
        },
        {
            "name" : "assists", 
            "value" : 10
        },
        ...
    ]
}

有什么方法可以获取所有已计算KDA的球员名单吗? KDA =(杀伤+辅助)/死亡

例如,像这样:

[{
    "_id" : <ObjectId>,
    "player" : <String>,
    "kda" : 2.5
},
...
]

以及如何对结果集合执行查询?查找KDA> 10等的所有玩家。 谢谢!

1 个答案:

答案 0 :(得分:1)

如果期望params数组中所有元素的顺序都相同,则一种方法如下:

db.collection.aggregate({
    $addFields: {
        "kda": {
            $divide: [
                { $sum: [
                    { $arrayElemAt: [ "$params.value", 0 ] },
                    { $arrayElemAt: [ "$params.value", 2 ] }
                ]},
                { $arrayElemAt: [ "$params.value", 1 ] } ] 
        }
    }
})

如果订单未知或未定,您可以执行以下操作:

db.collection.aggregate({
    $addFields: {
        "kda": {
            $divide: [
                { $sum: [
                    { $arrayElemAt: [ "$params.value", { $indexOfArray: [ "$params.name", "kills" ] } ] },
                    { $arrayElemAt: [ "$params.value", { $indexOfArray: [ "$params.name", "assists" ] } ] }
                ]},
                { $arrayElemAt: [ "$params.value", { $indexOfArray: [ "$params.name", "deaths" ] } ] } ] 
        }
    }

})