Mongodb: преобразовать диапазон дат в массив дат - PullRequest
0 голосов
/ 07 января 2020

Hy, у меня есть несколько документов с датой начала и датой окончания.

{
  startDate: ISODate("2020-01-07T00:00:00.000Z"),
  endDate: ISODate("2020-01-10T00:00:00.000Z")
}

Можно ли использовать агрегации mongodb, чтобы получить что-то вроде

[
  ISODate("2020-01-07T00:00:00.000Z"),
  ISODate("2020-01-08T00:00:00.000Z"),
  ISODate("2020-01-09T00:00:00.000Z"),
  ISODate("2020-01-10T00:00:00.000Z")
]

Цель состоит в том, чтобы Пересечь два диапазона дат, чтобы извлечь общую дату.

Большое спасибо

1 Ответ

1 голос
/ 07 января 2020

Вы можете использовать оператор $range (аналогично for l oop). Основная идея:

for(i=0; i<difference(endDate - startDate); i++){
    startDate + (i * `24 * 60 * 60 * 1000`)
}

difference(endDate - startDate) возвращает разницу во времени в миллисекундах, поэтому нам нужно разделить 24 * 60 * 60 * 1000


db.collection.aggregate([
  {
    $addFields: {
      range: {
        $range: [
          0,
          {
            $add: [
              {
                $divide: [
                  {
                    $subtract: [
                      "$endDate",
                      "$startDate"
                    ]
                  },
                  {
                    $multiply: [
                      24,
                      60,
                      60,
                      1000
                    ]
                  }
                ]
              },
              1
            ]
          },
          1
        ]
      }
    }
  },
  {
    $project: {
      _id: 0,
      result: {
        $map: {
          input: "$range",
          in: {
            $add: [
              "$startDate",
              {
                $multiply: [
                  "$$this",
                  24,
                  60,
                  60,
                  1000
                ]
              }
            ]
          }
        }
      }
    }
  }
])

{
  "result" : [ 
      ISODate("2020-01-07T00:00:00.000Z"), 
      ISODate("2020-01-08T00:00:00.000Z"), 
      ISODate("2020-01-09T00:00:00.000Z"), 
      ISODate("2020-01-10T00:00:00.000Z")
  ]
}
...