猫鼬 - 如何分组两个不同的计数

时间:2017-02-02 13:55:04

标签: mongoose count group-by aggregate

我需要这样的查询:

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

项目对象如下所示:

{
 _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 }
            }
        }
    ]
)

现在我收到了错误:

  

“例外:虚线字段名称仅允许在顶层”,

1 个答案:

答案 0 :(得分:0)

以下是答案:

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版本问题,否则我不确定可能是什么问题