Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将持续时间添加到日期mongodb_Node.js_Mongodb_Aggregate Functions - Fatal编程技术网

Node.js 将持续时间添加到日期mongodb

Node.js 将持续时间添加到日期mongodb,node.js,mongodb,aggregate-functions,Node.js,Mongodb,Aggregate Functions,我试图学习使用mongodb和nodejs,但我遇到了一个问题。 我在mongoDB中有一个名为Schedule的表,其中包含id、start和end字段。对于特定的行,只要开始时间小于结束时间,我就想在开始时间中添加一个持续时间 例如,我在明细表中有一行: { "_id": "123", "start": "2020-03-11T09:00:00.000Z", "end": "2020-03-11T18:00:00.000Z" } 持续时间参数为30分钟(30x60x

我试图学习使用mongodb和nodejs,但我遇到了一个问题。 我在mongoDB中有一个名为Schedule的表,其中包含id、start和end字段。对于特定的行,只要开始时间小于结束时间,我就想在开始时间中添加一个持续时间

例如,我在明细表中有一行:

{
   "_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"
 }
]

多谢各位

你可以用这个。关键运算符是
$map:{input:{$range:…
。首先必须计算大小(我使用
$let
),然后可以使用生成数组:

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" } }
])

嘿,Wernfried,非常感谢你的回答。工作很好,但我收到了两组数据。例如:`[{“id”:19,“时间”:“2020-03-11T18:00:00.000Z”},{“id”:1,“时间”:“2020-03-11T09:45:00.000Z”},{“id”:2,“时间”:“2020-03-11T10:15:00.000Z”}。我想在id为19的行之后停止它。我怎么做?再次感谢您!您的收藏中很可能有两个文档。请将
{$match:{u id:{123}}
放在开头。