Я хочу найти документ, который соответствует некоторому вычисленному идентификатору, а затем проверяет, является ли метка времени моложе 15 минут. Если это так, и документ найден, я хочу обновить документ с помощью req.body. В противном случае, если он старше 15 минут или документ не найден, я хочу создать новый документ с req.body.
Теперь мой вопрос: должен ли я использовать статический метод findOneAndUpdate или он слишком негибкий для моих целей?
Я использовал структуру агрегации, может ли она выполнять такие вещи, как поля обновления и / или поля установки, если они еще не существуют?
Это мой конвейер агрегации, который ищет идентификатор документа и метку времени менее 15 минут:
exports.calcID = function(req,res) {
console.log("Call aggregation stage..:")
Flex.aggregate([
{
$addFields: {
subID: {
"$eq": [{"$trunc": {"$divide": ["$_id", 1000000]}}, +req.params.demo_id]
},
rightTime: {
"$gte": ["$createdAt", new Date(+new Date()- 60*1000*15)]
}
}
},
{
"$match": {
subID:true,
rightTime:true
}
},
{
"$sort": {"Timestamp":-1}
},
{
"$limit": 1
},
{
"$project": {subID:0, rightTime:0}
}
]).exec(function(err, flPot) {
console.log(flPot);
console.log("Anzahl gefundener Dokumente: ", flPot.length)
if (flPot.length == 0) {
res.end("Keine Dokumente juenger 15 Minuten gefunden!")
var flex = new FlexPotenzial(req.body);
flex.save(function(err) {
if (err) {
console.log(err);
res.status(400);
res.send(err);
}
else {
console.log("Instanz FlexPotenzial in Datenbank erzeugt!");
res.status(200);
res.json({ message: 'FlexPotenzial-Instance created in datbase!\n', flex });
}
})
}
else if (flPot.lengh!==0) {
flPot.Timestamp = req.body.Timestamp;
flPot.aktThErzeugungsleistungWaerme = req.body.aktThErzeugungsleistungWaerme;
flPot.aktThNachfrageleistungWaerme = req.body.aktThNachfrageleistungWaerme;
flPot.aktThErzeugungsleistungGas = req.body.aktThErzeugungsleistungGas;
flPot.aktThNachfrageleistungGas = req.body.aktThNachfrageleistungGas;
flPot.aktLeistungsuntergrenze = req.body.aktLeistungsuntergrenze;
flPot.aktLeistungsobergrenze = req.body.aktLeistungsobergrenze;
flPot.BrennRohstoffbezug = req.body.BrennRohstoffbezug;
flPot.Produktstrom = req.body.Produktstrom;
flPot.Dummy1 = req.body.Dummy1;
flPot.Dummy2 = req.body.Dummy2;
flPot.Dummy3 = req.body.Dummy3;
flPot.Dummy4 = req.body.Dummy4;
flPot.save(function(err) {
if (err) {
console.log(err);
res.status(400);
res.send(err);
}
else {
console.log("FlexPotenzial aggregierte Daten in Datenbank aktualisiert!");
res.status(200);
res.json({ message: 'FlexPotenzial-Instance aggregated data updated!\n', flex });
}
}
)
}
});
}
Я не знаю, какой здесь лучший подход и как проверить, найдены или нет документы, как обновить поля и, если документы не найдены, как создать новые документы в агрегации или в отдельной функции, тогда ...