#javascript #node.js #mongodb #mongoose
Вопрос:
У меня есть схема задачи, как показано ниже :
const taskSchema = new mongoose.Schema({
uid: { type: String, default: "" },
status: { type: String, default: "" },
created_at: {type: Date}
}
Я хочу запросить все задачи, сгруппировав их таким образом, чтобы получить объект с количеством задач с разными статусами для всех дат данного месяца.
Пример — Предположим, что мы делаем это в июне месяце,
task = [
{
uid: '1',
status: 'completed',
created_at: 29 - 06 - 2021,
},
{
uid: '2',
status: 'pending',
created_at: 27 - 06 - 2021,
},
{
uid: '3',
status: 'missed',
created_at: 24 - 06 - 2021,
},
{
uid: '4',
status: 'completed',
created_at: 13 - 06 - 2021,
},
{
uid: '5',
status: 'pending',
created_at: 24 - 06 - 2021,
},
];
res = [
{
'13-06-2021': {
pending: 0,
missed: 1,
completed: 0,
},
},
{
'29-06-2021': {
pending: 0,
missed: 0,
completed: 1,
},
},
{
'27-06-2021': {
pending: 1,
missed: 0,
completed: 0,
},
},
{
'24-06-2021': {
pending: 1,
missed: 1,
completed: 0,
},
},
];
Я знаю агрегатные функции группы и подсчета, но я не могу понять, как это реализовать.
Ответ №1:
совокупный
db.collection.aggregate([
{
"$group": {
"_id": {
"created_at": "$created_at"
},
"pending": {
$sum: {
"$cond": [
{
"$eq": [
"$status",
"pending"
]
},
1,
0
]
}
},
"missed": {
$sum: {
"$cond": [
{
"$eq": [
"$status",
"missed"
]
},
1,
0
]
}
},
"completed": {
$sum: {
"$cond": [
{
"$eq": [
"$status",
"completed"
]
},
1,
0
]
}
},
}
}
])