【问题标题】:Mean stack: How to access data from MongoDB aggregation query?平均堆栈:如何从 MongoDB 聚合查询中访问数据?
【发布时间】:2018-06-22 08:38:10
【问题描述】:

我有一个问题,我的聚合查询没有向我的 res.json() 返回任何结果... 查询在 Node / Express 中看起来像这样:

exports.group_Produkt_by_month = function(req,res) {
        Produkt.aggregate([
            {
                "$unwind":"$DemonstratorWerte"
            },
            {
                "$group": {
                    "_id": {
                        "DemoID": "$DemonstratorWerte.Demonstrator", "Monat": {"$month":"$Erstellungszeitpunkt"}
                    },
                    "Anzahl":{"$sum":1}
                }
            },
            {
                "$project": {"DemoID": "$_id.DemoID", "Monat": "$_id.Monat", "Anzahl":1, "_id":0}
            },
            {
                "$addFields": { 
                    "Monat": { 
                        "$let":  { 
                            "vars": {  
                                "monthsInStrings": [, "Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] 
                            }, 
                            "in": {  
                                "$arrayElemAt": ['$$monthsInStrings','$Monat'] 
                            } 
                        } 
                    } 
                } 
            }
        ]).exec(function(err, prod) {
        if (err) {
                console.log(err);
            }

        else {
            console.log(typeof prod);
            console.log(prod[1])
            console.log(prod);
            res.json(prod);
        }
    }).then((res) => res.json())

    }

当我在 mongo shell 中执行查询时,查询正确执行并返回文档列表。现在我想将文档作为 res.json(docs) 或类似于 webbrowser 中的结果文档数组返回给我......我该怎么做?我听说必须使用.toArray() 方法,但我不知道在 Node/Express 中如何以及在何处执行此操作...

【问题讨论】:

    标签: mongodb aggregation-framework mean-stack


    【解决方案1】:

    您需要创建其余 api,然后进行查询或首先查看文档如何使用 express 获取/插入节点中的数据,检查您必须编写代码的文件夹/文件结构。 check here你可以连接任何数据库。

    exports.group_Produkt_by_month = function(req,res) {
           Produkt.aggregate([
                {
                    "$unwind":"$DemonstratorWerte"
                },
                {
                    "$group": {
                        "_id": {
                            "DemoID": "$DemonstratorWerte.Demonstrator", "Monat": {"$month":"$Erstellungszeitpunkt"}
                        },
                        "Anzahl":{"$sum":1}
                    }
                },
                {
                    "$project": {"DemoID": "$_id.DemoID", "Monat": "$_id.Monat", "Anzahl":1, "_id":0}
                },
                {
                    "$addFields": { 
                        "Monat": { 
                            "$let":  { 
                                "vars": {  
                                    "monthsInStrings": [, "Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] 
                                }, 
                                "in": {  
                                    "$arrayElemAt": ['$$monthsInStrings','$Monat'] 
                                } 
                            } 
                        } 
                    } 
                }
            ],function(err,result) {
            if(err) res.sendStatus(404);
             res.send(result);
          });
     }
    

    【讨论】:

    • 好吧,我已经创建了完整的 REST API,包括路由、模型、app.js 等......问题是,我使用 Produkt Schema 的其他路由和 api 方法工作正常,我有上面几行的另一个聚合函数,它给了我正确的json响应文档,只是使用这个函数,什么都没有返回,我什至没有收到控制台错误,问题似乎,它没有以某种方式进入函数,但我不知道为什么...我在函数开始时执行了“console.log("Entering function...")”,但没有任何东西打印到控制台...有什么想法吗?
    • 我的路由函数如下所示: function ProduktRoutes(router) { var ProduktController = require('../controllers/ProduktController') router.route('/Produkt') .get(ProduktController.list_all_Produkt ) .post(ProduktController.create_an_Produkt) router.route('/Produkt/:Produkt_id') .get(ProduktController.getProduktbyID) .put(ProduktController.updateProdukt) .delete(ProduktController.deleteProdukt) router.route('/Produkt/Monat ') .get(ProduktController.group_Produkt_by_month) } module.exports = ProduktRoutes;
    • 在使用 get 调用 API 时进行检查,如上所述作为 get 或 goto 网络选项卡/POSTMAN 使用正确的方法检查 api。
    【解决方案2】:

    好的, 我发现这与我的路线有关……它没有找到路线,因为它可能不够清晰,所以我附加了更多前缀链接 /.../... 然后它起作用了。

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多