提问者:小点点

对聚合选择中的结果进行计数


我的MongoDB数据库有一个结构


    {
        "_id" : ObjectId("5c1ccc20fc0f60769227d455"),
        "type" : 0,
        "id" : "hwJyzAHyfjXUlrGhblT7txWd",
        "userowner" : 1.0,
        "campid" : "9548",
        "date" : 1545391136,
        "useragent" : "mozilla/5.0 (windows nt 10.0; win64; x64; rv:65.0) gecko/20100101 firefox/65.0",
        "domain" : "",
        "referer" : "",
        "country" : "en",
        "language" : "en-US",
        "languages" : [ 
            "en-US", 
            "en"
        ],
        "screenres" : [ 
            "1920*1080"
        ],
        "avscreenres" : [ 
            "1080*1858"
        ],
        "webgl" : "angle (nvidia geforce gtx 1060 6gb direct3d11 vs_5_0 ps_5_0)",
        "hash" : 123,
        "timezone" : -180,
        "result" : true,
        "resultreason" : "learning",
        "remoteip" : "0.0.0.0"
    }

每个a文档都有一个带有bool值vield“result”。我进行聚合选择:


    db.getCollection('clicks').aggregate([
        { $match: {userowner: 1, date:{$gte: 0, $lte: 9545392055}} },
        { $group : {_id : "$campid",
                number: {$sum: 1}}}
    ])

并得到一个结果:


    /* 1 */
    {
        "_id" : "4587",
        "number" : 2.0
    }

    /* 2 */
    {
        "_id" : "9548",
        "number" : 1346.0
    }

如何计算字段“result”中值“true”和“false”的数量,并得到如下结果:


    /* 1 */
    {
        "_id" : "4587",
        "number" : 2.0,
        "passed":100,
        "blocked":120
    }

    /* 2 */
    {
        "_id" : "9548",
        "number" : 1346.0,
        "passed":100,
        "blocked":120
    }


共1个答案

匿名用户

我希望这能按照你的要求工作。

db.getCollection('clicks').aggregate(
[
    {
        $match: {
            userowner: 1, date: {
                $gte: 0, $lte: 9545392055
            }
        }
    },
    {
        $group: {
            _id: "$campid", passed: {
                $sum: {
                    $cond:
                        [
                            { $eq: ["$result", true] },
                            1, 0
                        ]
                }
            },
            blocked: {
                $sum: {
                    $cond:
                        [
                            {
                                $eq: ["$result", false]
                            }

                            , 1, 0]
                }
            },
            number: { $sum: 1 }
        }
    },
    {
        $project: {
            _id: 0,
            campid: "$_id",
            number: 1,
            passed: 1,
            blocked: 1
        }
    }

])

输出:-

{ 
    "passed" : 3,
    "blocked" : 2, 
    "number" : 5,
    "campid" : "4587"
}
{
    "passed" : 2, 
    "blocked" : 1, 
    "number" : 3, 
    "campid" : "9548" 
}

有关更多信息,请参阅$GROUP、$COND和$EQ。