迭代一个mongoDB集合,对每一项执行一个异步的Aggregation任务,当它们都完成后return JSON在Response中

Iterate over a mongoDB collection, perform an asynchronous task of Aggregation for each item, and when they’re all done return JSON in Response

尝试从 MongoDB 集合的列表中聚合一些数据,当对所有集合进行聚合时,我想 return 所有合适的集合的完整聚合,名称和聚合值作为 JSON 对象返回。 node.js 编程新手,因此无法解决这个微不足道的问题。任何帮助表示赞赏

代码:

app.get('/tester', (req, res) => {

    var AggArr = [];

    db.listCollections().toArray(function (err, collInfos) {
        async.forEachOf(collInfos, (value, key, callback) => {
            aggregate(value);
        }, err => {
            if (err)
                console.error(err.message);
            // configs is now a map of JSON data
            res.send(JSON.stringify(AggArr));
        });
    });
        function aggregate(collname) {
        if (collname.name.includes("_tps")) {
            db.collection(collname.name).aggregate([{
                        $match: {
                            $and: [{
                                    TIME: {
                                        $gte: new Date("2017-01-01T00:00:00Z")
                                    }
                                }, {
                                    TIME: {
                                        $lte: new Date("2017-12-31T23:59:59Z")
                                    }
                                }
                            ]
                        }
                    }, {
                        $group: {
                            _id: collname.name,
                            sum: {
                                $sum: "$TPS"

                            }
                        }
                    }
                ]).toArray(
                (err, result) => {
                if (err) {
                    return console.log(err)
                } else {
                    if (Object.keys(result).length === 0) {}
                    else {
                        console.log(result[0]);
                        AggArr.push(result[0]);
                    }
                }
            })
        }
        }
    })

我是 Node.js 编程的新手,遇到了这个小问题,非常感谢任何帮助。

以上工作流程可以重构为如下

const pipeline = collectionName => (
    [
        { '$match': {
            'TIME': {
                '$gte': new Date("2017-01-01T00:00:00Z"), 
                '$lte': new Date("2017-12-31T23:59:59Z")
            }
        } }, 
        { '$group': {
            '_id': collectionName,
            'sum': { '$sum': "$TPS" }
        } }
    ]
);

db.listCollections().toArray((err, collInfos) => {
    const agg = collInfos
        .filter(col => col.name.includes("_tps"))
        .map(col => db.collection(col.name).aggregate(pipeline(col.name)).toArray());

    Promise.all(agg).then(data => {
        const results = data.map(d => d[0]);
        res.send(JSON.stringify(results));   
    });
});

当您 return 回复任何查询时,它应该如下所示。它将以 JSON 格式给出响应。

    app.get('/tester', (req, res) => {
    //DB Operaations
    if (success) {
        res.status(200).json(success);
    } else {
        res.status(500).json({
            message: 'Something went wrong'
        });
    }
});