在 Mongodb 中使用 $function 获取请求

GET request with $function in Mongodb

总结: 我正在尝试将 Mongodb 聚合的结果与第三方 API 相结合,但我找不到任何与之相关的内容。

解释: 下面的 Express 路线查找所有在提供的日期之后出现且未被取消的游戏。下一步是从第三方 API 获取该单个游戏的一些数据并将其附加到对象并在管道中继续

问题: 似乎你不能在 $function 中有一个 XHR 请求(我在官方文档中没有找到任何东西,所以我不确定)

        const today = moment();
        today.year(2021);
        today.month(5);
        let response = await Game.aggregate([
            {
                $match: {
                    $expr: {
                        $and: [
                            { $gte: ["$date", moment(today).startOf('day').toDate()] },
                            { $eq: ["$canceled", false] },
                        ]
                    }
    
                }
            },
            { $sort: { date: 1 } },
            {
                $addFields: {
                    boxScore: {
                        $function:
                        {
                            body: async function (season, week, home_team) {
                                const result = await axios.get(
                                    `SINGLEGAMEURL/${season}/${week}/${home_team}`,
                                    {
                                        headers: {
                                            'Subscription-Key': 'SOMEKEY',
                                        },
                                    }
                                );
                                return result.data;
                            },
                            args: ["$season", '$week', 'home_team'],
                            lang: "js"
                        }
                    }
                }
            }
        ]);

我非常感谢help/direction,干杯!

我怀疑您是否可以在 $function 中使用异步函数,因为它们 return 一个解析为 result.data 的承诺,而不是数据本身。相反,请考虑在您的快速中间件中执行异步操作, MongoDB 操作之后。像这样:

app.use("/path", async function(req, res) {
  const today = moment();
  today.year(2021);
  today.month(5);
  let response = await Game.aggregate([
    {$match: ...},
    {$sort: {date: 1}}
  ]).toArray();
  await Promise.all(response.map(row => axios.get(
    `SINGLEGAMEURL/${row.season}/${row.week}/${row.home_team}`,
    {headers: {'Subscription-Key': 'SOMEKEY'}}
  ).then(function(result) {
    row.boxScore = result.data;
  })));
  res.json(response);
});

(可能 Promise.all 可以避免,但我对 async/await 的经验还不够,不知道该怎么做。)