Mongoose - 如何按两个不同的计数分组

Posted

技术标签:

【中文标题】Mongoose - 如何按两个不同的计数分组【英文标题】:Mongoose - how to group by two different counts 【发布时间】: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 
            
        
    ]
)

现在我收到错误:

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

【问题讨论】:

【参考方案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

以上是关于Mongoose - 如何按两个不同的计数分组的主要内容,如果未能解决你的问题,请参考以下文章

按同一列分组,但以两种不同的方式聚合

如何按范围分组,或有条件地从查询结果中选择

在同一个mongodb查询中选择按计数和不同计数分组

是否可以在不加入的情况下按计数(不同)进行分组?

按月对记录进行分组并计数 - Mongoose、nodeJs、mongoDb

选择按month.year分组的两个日期之间的用户计数,并且对于count = 0的月份包括零