Генерировать статистику с помощью Aggregation MongoDB

#javascript #mongodb #mongodb-query #aggregation-framework

#javascript #mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

Я новичок в агрегации MongoDB.

Я играю с небольшим веб-приложением для ежедневного хранения посещаемости и составления отчетов о ней на основе месяца и года.

это коллекция посещаемости в DB :

 {
        _id : 5f3b7f85a189d04eec4ec2e8
        dated :2020-03-18T12:01:25.348 00:00
        empId:"10013"
        employee:5f2b66620ec17b4b1034549a
        weekOff:false
        inTime:2020-08-18T12:01:34.308 00:00
        outTime:2020-08-18T12:10:34.308 00:00
        present:true
        startLate:true
        leaveEarly:true
} ........
  

как мне получить подобную статистику :

 {
    month : 01,
    year : 2020,
    present : 75 %
    absent : 25%
    startLate : 10%
    leaveEarly: 25%
},
{
    month : 02,
    year : 2020,
    present : 80 %
    absent : 22%
    startLate : 20%
    leaveEarly: 05%
}, ...
  

Я пытался, но не смог сделать это правильно

Комментарии:

1. Ты что-нибудь пробовал?

2. на самом деле я очень новичок в этом, просто пытаюсь разобраться.

Ответ №1:

Начните с разделения даты на составные части с помощью $dateToParts оператора.

После этой группы, основанной на месяце и году, суммируйте все present , startLate и leaveEarly и количество тоже.

После группировки спроецируйте требуемые поля и рассчитайте процент.

Вот fiddle из приведенных ниже.

 var pipeline = [
  {
    $addFields: {
      date: {
        $dateToParts: {
          date: "$dated"
        }
      }
    }
  },
  {
    $group: {
      _id: {
        month: "$date.month",
        year: "$date.year"
      },
      sum: {
        $sum: 1
      },
      present: {
          $sum: {
            $cond: {
              if: { $eq: ['$present', true] },
              then: 1,
              else: 0
            }
          }
      },
      absent: {
          $sum: {
            $cond: {
              if: { $eq: ['$present', false] },
              then: 1,
              else: 0
            }
          }
      },
      startLate: {
          $sum: {
            $cond: {
              if: { $eq: ['$startLate', true] },
              then: 1,
              else: 0
            }
          }
       },
       leaveEarly: {
          $sum: {
            $cond: {
              if: { $eq: ['$leaveEarly', true] },
              then: 1,
              else: 0
            }
          }
       }
    }
  },
  {
    $project: {
        month: '$id.month',
        year: '$id.year',
        "present": {
            $multiply: [
                { $divide: ["$present", "$sum"] },
                100
            ]
        },
        "absent": {
            $multiply: [
                { $divide: ["$absent", "$sum"] },
                100
            ]
        },
        "startLate": {
            $multiply: [
                { $divide: ["$startLate", "$sum"] },
                100
            ]
        },
        "leaveEarly": {
            $multiply: [
                { $divide: ["$leaveEarly", "$sum"] },
                100
            ]
        }
    }
  }
];

db.collection.aggregate(pipeline);
  

Комментарии:

1. Спасибо @Kunal Mukherjee за помощь, высоко ценится😁