mongoose: findOneAndUpdate найти более сложное выражение, чем _id - PullRequest
0 голосов
/ 29 июня 2018

Я хочу найти документ, который соответствует некоторому вычисленному идентификатору, а затем проверяет, является ли метка времени моложе 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 });
                        }
                    }
                )
            }
        });
    }

Я не знаю, какой здесь лучший подход и как проверить, найдены или нет документы, как обновить поля и, если документы не найдены, как создать новые документы в агрегации или в отдельной функции, тогда ...

1 Ответ

0 голосов
/ 29 июня 2018

Я предполагаю, что вы разделите свой сохраненный идентификатор, чтобы получить диапазон идентификаторов. Почему бы не сделать это в запросе:

const minID = req.params.demo_id * 1000000;
const maxID = (req.params.demo_id + 1) * 1000000;
const fifteenMinutesAgo = new Date(Date.now() - 15*3600*1000)
Flex.findOneAndUpdate({
  _id: { $gte: minID, $lt: maxID },
  createdAt: { $gte: fifteenMinutesAgo }
}, { $set: req.body })

Конечно, вы должны дезинфицировать свои входные данные, а не просто добавлять req.body in.

Если вычисление идентификатора сложнее, чем то, что вы указали в этом фрагменте, рассмотрите возможность сохранения его в своем документе.

...