как получить счет от mongodb с другим статусом из одной коллекции - PullRequest
0 голосов
/ 25 июня 2018

У меня есть коллекция встреч, в которой у меня есть коды состояния, такие как предстоящий, отмененный, завершенный. я хочу написать API, чтобы получить счетчик каждого статуса, используя методы mongoose или mongodb.

вывод должен быть как ниже

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

спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Используя Агрегационный конвейер $ group мы можем получить это количество

db.collection_name.aggregate([ 
   { $group: { 
       _id:null, 
       appointments_completed: {$sum : "$appointments_completed" }, 
       appointments_upcoming:{$sum :"$appointments_upcoming"}, 
       appointments_cancelled:{$sum: "$appointments_cancelled"}
      }
    }
]);
0 голосов
/ 25 июня 2018

С 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 }
    ]
}

Если коды состояния фиксированы, то $cond*Оператор 1025 * в шаге конвейера $group может эффективно использоваться для оценки счетчиков на основе значения поля состояния.Ваш общий конвейер агрегации можно построить следующим образом, чтобы получить результат в нужном формате:

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

0 голосов
/ 25 июня 2018

Я надеюсь, что это поможет вам

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

Результат будет

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

]

Я думаю, вы можете обработать его с помощью nodejs

...