Группировка в MongoDB на основе условия

#javascript #node.js #mongodb #mongodb-query

Вопрос:

У меня есть схема задачи —

 const taskSchema = new mongoose.Schema({
      type: { type: String, default: '' },
      status: {type: String },
      due_date : {type: Date}
    });
 

status может быть «Завершено» и «В ожидании».

type это может быть «Перезвонить», «Навестить» и «Встретиться».

У меня есть еще один статус «Просрочено», который является особым случаем «В ожидании», если текущая дата ( новая дата() ) больше, чем due_date , но она хранится в базе данных только как «В ожидании».

Примеры данных —

 [
    {
        type: 'Call Back', 
        status: 'Pending', 
        due_date: 2021-08-18T05:40:59.007 00:00
    },
    {
        type: 'Site', 
        status: 'Pending', 
        due_date: 2021-09-18T05:40:59.007 00:00
    }, 
    {
        type: 'Call Back', 
        status: 'Completed', 
        due_date: ''
    }, 
    {
        type: 'Meet', 
        status: 'Pending', 
        due_date: 2021-11-18T05:40:59.007 00:00
    }
]
 

Я хочу что-то вроде этого —

 {
    Pending: { 
        'Call Back' : 1, 
        'Meet': 0, 
        'Site' 1
    }, 
    Completed: { 
        'Call Back' : 1, 
        'Meet': 0, 
        'Site' 0 
    }, 
    Overdue: {
        'Call Back' : 0, 
        'Meet': 1, 
        'Site' 0 
    }
}
 

Я сталкиваюсь с трудностями, потому что на самом деле у меня нет статуса «Просрочено» в моей схеме, но он мне нужен во время группировки.

Ответ №1:

Вы можете использовать $addFields для условного переопределения status поля на «Просрочено». Затем продолжайте группировку и разбор данных, как обычно.

  {
    "$addFields": {
      "status": {
        "$cond": {
          "if": {
            $gt: [
              "$due_date",
              new Date()
            ]
          },
          "then": "Overdue",
          "else": "$status"
        }
      }
    }
}
 

Вот игровая площадка Монго для вашей справки.