猫鼬:findOneAndUpdate 找到比 _id 更复杂的表达式

mongoose: findOneAndUpdate find more complicated expression than _id

我想找到一个文档,它匹配一些计算出的 ID,然后查看时间戳是否小于 15 分钟。如果是这样并且找到了文档,我想用 req.body 更新文档。否则,如果它超过 15 分钟,或者没有找到文档,我想用 req.body.

创建一个新文档

现在我的问题是,我应该使用静态 findOneAndUpdate 方法还是它对我的目的来说太不灵活了? 我正在使用聚合框架,它可以做那些类型的事情吗,比如更新字段和/或设置字段(如果它们还不存在)? 这是我的聚合管道,用于查找不到 15 分钟的文档 ID 和时间戳:

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 });
                        }
                    }
                )
            }
        });
    }

我不知道这里最好的方法是什么,如何在找到文档后进行检查,如何更新字段,如果没有找到文档,如何在聚合或单独的文档中创建新文档然后函数...

我假设您将存储的 ID 分开以获得一系列 ID。为什么不在查询中这样做:

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 扔进去。

如果 ID 计算比您在此代码段中输入的更复杂,请考虑将其存储在您的文档中。