Как преобразовать результат MongoDB, сгруппированный по $ week, в формат даты?

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

#javascript #node.js #mongodb #мангуст #mongodb-запрос

Вопрос:

Я хочу создать отчет, в котором я показываю сумму часов еженедельно. Я использую MongoDB и группирую по $ week. Мне нужно различать недели по годам, и в моем отчете должна быть дата для первого дня недели и последнего дня недели вместо номера недели. Вот мой конвейер.

 let pipeline = [
{
  $match: {
    companyId,
  },
},
{
  $group: {
    _id: {
      $week: '$date',
    },
  },
},
{
  $project: {
    companyId: '$companyId',
  },
},];
  

и вот моя коллекция :

 const hoursSchema = mongoose.Schema({
  personId: mongoose.Schema.Types.ObjectId,
  jobId: Number,
  companyId: Number,
  name: String,
  date: Date,
  hours: Number,
});
  

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

1. Вы можете использовать $sum вместе с $group , чтобы получить сумму за hours неделю.

2. Я отредактировал свой вопрос, я искал способ преобразовать номер недели в формат даты (первый день недели и последний день недели).

Ответ №1:

в итоге я добавил год и использовал функцию отдельно для извлечения даты из номеров недель и лет. Конвейер выглядит так:

 let pipeline = [
    {
      $match: {
        companyId,
      },
    },
    {
      $group: {
        _id: {
          week: { $week: { date: '$date' } },
          year: { $year: { date: '$date' } },
          name: '$name',
          jobTitle: '$jobTitle',
          jobId: '$jobId',
          companyId: '$companyId',
          personId: '$personId',
        },
        count: { $sum: 1 },
        hours: { $sum: '$hours' },
      },
    },
  ];
  

Я помещаю данные пользователя в $group _id для извлечения информации для каждого пользователя. таким образом, каждый мой объект, сгруппированный по объекту, теперь имеет год и неделю, и я мог бы использовать это для вычисления даты для первого и последнего дня недели.