在 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 的经验还不够,不知道该怎么做。)
总结: 我正在尝试将 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 的经验还不够,不知道该怎么做。)