Node.js 将持续时间添加到日期mongodb
我试图学习使用mongodb和nodejs,但我遇到了一个问题。 我在mongoDB中有一个名为Schedule的表,其中包含id、start和end字段。对于特定的行,只要开始时间小于结束时间,我就想在开始时间中添加一个持续时间 例如,我在明细表中有一行: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
{
"_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}}
放在开头。