Передача данных с воскресенья на неделю до этого в MongoDB - PullRequest
0 голосов
/ 20 июня 2020

Моя агрегация получает данные документов за неделю. В этом случае я получаю данные с 18 по 24 мая:

{ "_id" : 20, "count" : 795 }
{ "_id" : 21, "count" : 221 }

Поскольку «неделя» в понедельник go начинается с воскресенья, данные с воскресенья создают новую неделю (в этом случай 21). Есть ли способ перенести данные с воскресенья на неделю до или назад?

Результат будет:

{ "_id" : 20, "count" : 1016 }

Агрегация:

[{
    $match: {
       start_date: {
          $gte: ISODate('2020-05-18T00:00:01'),
          $lte: ISODate('2020-05-24T23:59:59')
       }
    }
}, {
    $project: {
       week: {
          $week: '$start_date'
       },
       solved: '$solved',
       survey: '$survey'
    }
}, {
    $group: {
       _id: '$week',
       count: {
          $sum: 1
       }
    }
}, {
    $sort: {
       _id: 1
    }
}]

ОБНОВЛЕНИЕ : Пн go

1 Ответ

1 голос
/ 20 июня 2020

Я думаю, что следующий запрос поможет.

Ключ timezone в условии if может быть удален, если ваш week-wise-sort не зависит от часового пояса значения ISODate в БД

db.<Collection-Name>.aggregate([
    {
        $match: {
           start_date: {
              $gte: ISODate('2020-05-18T00:00:01'),
              $lte: ISODate('2020-05-24T23:59:59')
           }
        }
    }, {
        $project: {
           week: {
               "$cond": {
                   "if": {"$eq": [{"$dayOfWeek": {"date": "$start_date", "timezone": "-0500"}}, 1]},
                   "then": {"$subtract": [{"$week": '$start_date'}, 1]},
                   "else": {"$week": '$start_date'}
               }
           },
           solved: '$solved',
           survey: '$survey'
        }
    }, {
        $group: {
           _id: '$week',
           count: {
              $sum: 1
           }
        }
    }, {
        $sort: {
           _id: 1
        }
    }
])
...