#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 за помощь, высоко ценится😁