Добавить продолжительность до даты mongodb - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь научиться работать с mongodb и nodejs, и у меня проблема. У меня есть таблица в mongoDB, которая называется Schedule с полями id, start и end. Для указанной строки c я хочу добавить к времени начала длительность, если время начала меньше конца.

Пример. У меня есть строка в таблице расписания:

{
   "_id": "123", 
   "start": "2020-03-11T09:00:00.000Z", 
   "end": "2020-03-11T18:00:00.000Z"
} 

параметр продолжительности 30 минут (30x60x1000ms). Я хочу получить следующий результат:

[
 {"id":1, "time":"2020-03-11T09:00:00.000Z"}, 
 {"id":2, "time":"2020-03-11T09:30:00.000Z"}, 
 {"id":3, "time":"2020-03-11T10:00:00.000Z"}, 
 {"id":4, "time":"2020-03-11T10:30:00.000Z"},   
 {"id":5, "time":"2020-03-11T11:00:00.000Z"},
 ...
 {"id":n, time:"2020-03-11T18:00:00.000Z}
]

Я пытался с агрегацией $ add, но я получаю только первую строку.

const {idSchedule} = req.params;
const {duration} = req.body;
const durationMs = duration*60*1000;
console.log('duration',duration);
objId = new ObjectID(idSchedule); 
Schedule.aggregate([
   { "$match":{
        "_id": objId,
        }
    },
   { $project: { _id: 1, time: { $add: [ "$start", durationMs ] } } }
]).then((response) => {
    res.send(response)
})

И я получаю только:

[
 {
    "_id": "5e68ebf0992e173a28e7dd46",
    "time": "2020-03-11T09:30:00.000Z"
 }
]

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

1 Ответ

1 голос
/ 19 марта 2020

Вы можете использовать это. Ключевой оператор - $map: { input: { $range: .... Сначала вы должны рассчитать размер (для этого я использую $let), а затем вы можете использовать $ range для генерации массива:

db.collection.aggregate([
   {
      $set: {
         interval: {
            $let: {
               vars: {
                  size: {
                     $divide: [{ $subtract: ["$end", "$start"] }, { $multiply: [1000, 60] }]
                  }
               },
               in: {
                  $map: {
                     input: { $range: [0, { $add: ["$$size", 1] }, 30] },
                     in: {
                        id: { $add: [{ $divide: ["$$this", 30] }, 1] },
                        time: { $add: ["$start", { $multiply: [1000, 60, "$$this"] }] }
                     }
                  }
               }
            }
         }
      }
   },
   { $unwind: "$interval" },
   { $replaceRoot: { newRoot: "$interval" } }
])

Mon go детская площадка

...