【问题标题】:how get count from mongodb with different status from one collection如何从一个集合中以不同状态从 mongodb 获取计数
【发布时间】:2018-06-25 18:25:13
【问题描述】:

我有约会集合,因为我有即将到来、已取消、已完成等状态代码。我想编写一个 api 来使用 mongoose 或 mongodb 方法获取每个状态的计数。

输出应该如下所示

[{
    group : "grp1",
    appointments_completed :4
    appointments_upcoming :5
    appointments_cancelled : 7
}]

提前致谢。

【问题讨论】:

  • 你要一个请求还是多个请求也好?
  • 提供一些示例数据。

标签: node.js mongodb mongoose aggregation-framework


【解决方案1】:

希望对你有帮助

db.getCollection('codelist').aggregate([
{
    $group:{
    _id:{status:"$status"},
    count:{$sum:1}
    } 
}
])

结果是

[{
    "_id" : {
        "status" : "cancelled"
    },
    "count" : 13.0
},
{
    "_id" : {
        "status" : "completed"
    },
    "count" : 20.0
}

]

我认为你可以用nodejs处理它

【讨论】:

  • $status 不是集合中的属性,它具有不同的状态,例如已完成、即将到来和已取消。
  • 你没有显示数据示例,这就是为什么我认为你有属性状态。
  • 非常感谢您的回答 Evgeniy 。它对我来说工作正常。非常感谢
【解决方案2】:

使用Aggregation Pipeline $group 我们可以得到这个计数

db.collection_name.aggregate([ 
   { $group: { 
       _id:null, 
       appointments_completed: {$sum : "$appointments_completed" }, 
       appointments_upcoming:{$sum :"$appointments_upcoming"}, 
       appointments_cancelled:{$sum: "$appointments_cancelled"}
      }
    }
]);

【讨论】:

    【解决方案3】:

    在 MongoDb 3.6 及更高版本中,您可以利用 $arrayToObject 运算符和 $replaceRoot 管道来获得所需的结果。您需要运行以下聚合管道:

    db.appointments.aggregate([
        { "$group": {
            "_id": {  
                "group": <group_by_field>,
                "status": { "$concat": ["appointments_", { "$toLower": "$status" }] }
            },
            "count": { "$sum": 1 }
        } },
        { "$group": {
            "_id": "$_id.group",
            "counts": {
                "$push": {
                    "k": "$_id.status",
                    "v": "$count"
                }
            }
        } },
        { "$addFields": {
            "counts": {
                "$setUnion": [
                    "$counts", [
                        {
                            "k": "group",
                            "v": "$_id"
                        }
                    ]
                ]
            }
        } },
        {  "$replaceRoot": {
            "newRoot": { "$arrayToObject": "$counts" }
        } }    
    ])
    

    对于旧版本,虽然输出格式不同,但更通用的方法是分组两次并将计数作为键值对象数组获取,如下所示:

    db.appointments.aggregate([
        { "$group": {
            "_id": { 
                "group": <group_by_field>,
                "status": { "$toLower": "$status" }
            },
            "count": { "$sum": 1 }
        } },
        { "$group": {
            "_id": "$_id.group",
            "counts": {
                "$push": {
                    "status": "$_id.status",
                    "count": "$count"
                }
            }
        } }
    ])
    

    吐出来:

    {
        "_id": "grp1"
        "counts":[
            { "status": "completed", "count": 4 },
            { "status": "upcoming", "count": 5 }
            { "status": "cancelled", "count": 7 }
        ]
    }
    

    如果状态代码是固定的,那么$group 管道步骤中的$cond 运算符可以有效地用于根据状态字段值评估计数。您的整体聚合管道可以按如下方式构建,以生成所需格式的结果:

    db.appointments.aggregate([    
        { "$group": { 
            "_id": <group_by_field>,             
            "appointments_completed": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "completed" ] }, 1, 0 ]
                }
            },
            "appointments_upcoming": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "upcoming" ] }, 1, 0 ]
                }
            },
            "appointments_cancelled": {
                "$sum": {
                    "$cond": [ { "$eq": [ "$status", "cancelled" ] }, 1, 0 ]
                }
            }
        } }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2020-03-09
      • 2019-01-13
      • 2019-03-20
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多