我试图根据计算字段计算MongoDB查询中的百分比——不确定这是否可行.我想做的是计算失败率:(failed count / total) * 100

以下是一些示例文档:

    {
            "_id" : ObjectId("52dda5afe4b0a491abb5407f"),
            "type" : "build",
            "time" : ISODate("2014-01-20T22:39:43.880Z"),
            "data" : {
                    "buildNumber" : 30,
                    "buildResult" : "SUCCESS"
            }
    },
    {
            "_id" : ObjectId("52dd9fede4b0a491abb5407a"),
            "type" : "build",
            "time" : ISODate("2014-01-20T22:15:07.901Z"),
            "data" : {
                    "buildNumber" : 4,
                    "buildResult" : "FAILURE"
            }
    },
    {
            "_id" : ObjectId("52dda153e4b0a491abb5407b"),
            "type" : "build",
            "time" : ISODate("2014-01-20T22:21:07.790Z"),
            "data" : {
                    "buildNumber" : 118,
                    "buildResult" : "SUCCESS"
            }
    }

以下是我试图处理的问题.问题出现在FailPercent/$divide行中:

db.col.aggregate([    
    { $match: { "data.buildResult" : { $ne : null } } },
    { $group: {          
        _id: {              
            month: { $month: "$time" },             
            day: { $dayOfMonth: "$time" },             
            year: { $year: "$time" },                       
        },         
        Aborted: { $sum: { $cond :  [{ $eq : ["$data.buildResult", "ABORTED"]}, 1, 0]} },
        Failure: { $sum: { $cond :  [{ $eq : ["$data.buildResult", "FAILURE"]}, 1, 0]} },
        Unstable: { $sum: { $cond : [{ $eq : ["$data.buildResult", "UNSTABLE"]}, 1, 0]} },
        Success: { $sum: { $cond :  [{ $eq : ["$data.buildResult", "SUCCESS"]}, 1, 0]} },
        Total: { $sum: 1 },
        FailPercent: { $divide: [ "Failure", "Total" ] }
    } },     
    { $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1 } } 
])

推荐答案

你差点就成功了.唯一需要改变的是,你必须在额外的project阶段计算FailPercent,因为总数只有在group阶段完成后才可用.试试这个:

db.foo.aggregate([    
    { $match: { "data.buildResult" : { $ne : null } } },
    { $group: {          
        _id: {              
            month: { $month: "$time" },             
            day: { $dayOfMonth: "$time" },             
            year: { $year: "$time" },                       
        },         
        Aborted: { $sum: { $cond :  [{ $eq : ["$data.buildResult", "ABORTED"]}, 1, 0]} },
        Failure: { $sum: { $cond :  [{ $eq : ["$data.buildResult", "FAILURE"]}, 1, 0]} },
        Unstable: { $sum: { $cond : [{ $eq : ["$data.buildResult", "UNSTABLE"]}, 1, 0]} },
        Success: { $sum: { $cond :  [{ $eq : ["$data.buildResult", "SUCCESS"]}, 1, 0]} },
        Total: { $sum: 1 }
    } }, 
    {$project:{Aborted:1, Failure:1, Unstable:1, Success:1, Total:1, FailPercent: { $divide: [ "$Failure", "$Total" ]}}},
    { $sort: { "_id.year": 1, "_id.month": 1, "_id.day": 1 } } 
])

Mongodb相关问答推荐

如何在MongoSH中的现有文档中插入字段

为什么使用 Golang Mongo 驱动程序进行简单查询需要超过 2 秒?

Mongoose 聚合和多级组

构造函数的参数 0 需要错误类型的 bean

在 ExpirePolicy 之后从 Store 中删除元素

在我的查询中使用 populate() 时的 MongoDB createIndex()

MongoDB - 分组并找到前 N 个

如何在mongodb中级联删除文档?

使用 Node.js 通过 SSL 连接到 MongoDB

MongoDB:单个数据库处理程序的 >5 个打开连接

NodeJS中的密码重置

Spring Mongo 条件查询两次相同的字段

Python - Pymongo 插入和更新文档

使用 MongoDB 进行嵌套分组

如何使用node.js http服务器从mongodb返回大量行?

在安装的 MongoDB homebrew 中设置 dbpath (Mac OS)

如何使用 Pymongo 在 MongoDB 中 Select 单个字段?

如何匹配 MongoDB 聚合框架中的 undefined值?

带有索引字段的 MongoDB 正则表达式

对象不是 JSON 可序列化的