【问题标题】:Mongoose - how to group by two different countsMongoose - 如何按两个不同的计数分组
【发布时间】:2017-06-19 15:09:21
【问题描述】:

我需要这样的查询:

db.items.aggregate([
{
    $group: {
        _id: '$dataset_id',
        labeledCount: {WHERE labels.length>0}, // this line is problem
        totalCount: {$sum: 1}
    }
}])

Item 对象如下所示:

{
 _id: 1,
 labels: [...]
 ...
}

结果应该是这样的:

{_id: 1, labeledCount: 4, totalCount: 5},
{_id: 2, labeledCount: 0, totalCount: 4},
...

编辑
这是我最接近的:

db.items.aggregate(
    [
        {
            $group : { 
                _id : "$dataset_id",
                "labeled" :  {
                    $sum : {
                        $cond : { if: { "$labels.0": { "$exists": true } }, then: 1, else: 0}
                    }
                },
                "total" : { $sum : 1 }
            }
        }
    ]
)

现在我收到错误:

"例外:虚线字段名只允许在顶层",

【问题讨论】:

    标签: mongoose count group-by aggregate


    【解决方案1】:

    答案如下:

    db.items.aggregate(
        [
            {
                $group : { 
                    _id : "$dataset_id",
                    "labeled" :  {
                        $sum : {
                            $cond : { if: { $ne: [0, { $size: "$labels" }]}, then: 1, else: 0}
                        }
                    },
                    "total" : { $sum : 1 }
                }
            }
        ]
    )
    

    说明:
    { $size: "$labels" } 返回labels 数组中的元素数。
    $ne: [0, { $size: "$labels" }] 检查 labels 是否有 0 个元素



    编辑
    我刚刚将它部署到服务器,它会引发以下错误:

    例外:$cond 运算符需要一个包含 3 个操作数的数组

    但在本地它可以工作。将尝试检查它是否是 mongo 版本问题,否则我不确定可能是什么问题

    【讨论】:

    • 这将适用于 2.6 及更高版本的 mongodb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2014-12-19
    • 1970-01-01
    • 2023-03-14
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多