Хотите получить количество товаров на каждую дату данного месяца в MongoDB

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

mongoplayground