如何对集合中所有匹配文档中的特定ID执行$lookup



我面临一个问题,因为我在集合B中的文档的集合a中有引用ID,假设我有两个集合

程序员

_id: ObjectID('1'),
name: "Ryan Dahl",
profession: "Node.js",
country: 01,
_id: ObjectID('2')
name: "Dan Abramov",
profession: "React.js",
country: 02,

和另一个收藏国家

_id: ObjectID('01')
name: 'USA',
capital: "Washington",
_id: ObjectID('02')
name: 'Russia',
capital: "Moscow",

我根据他们的专业查询所有文件,并假设";Node.js"从程序员集合中提取100个文档,如下面的

_id: ObjectID('1'),
name: "Ryan Dahl",
profession: "Node.js",
country: 01,
_id: ObjectID('2'),
name: "Stephen Grider",
profession: "Node.js",
country: 01,
_id: ObjectID('3'),
name: "Brad Traversy",
profession: "Node.js",
country: 01,
_id: ObjectID('4'),
name: "Matteo Collina",
profession: "Node.js",
country: 03,

现在我想对所有结果执行$lookup运算符,以便在国家/地区集合中引用countryId,预期的结果如下

_id: ObjectID('1'),
name: "Ryan Dahl",
profession: "Node.js",
country: {
_id: ObjectID('01')
name: 'USA',
capital: "Washington",
}
_id: ObjectID('2'),
name: "Stephen Grider",
profession: "Node.js",
country: {
_id: ObjectID('01')
name: 'USA',
capital: "Washington",
}
_id: ObjectID('3'),
name: "Brad Traversy",
profession: "Node.js",
country: {
_id: ObjectID('01')
name: 'USA',
capital: "Washington",
}
_id: ObjectID('4'),
name: "Matteo Collina",
profession: "Node.js",
country: {
_id: ObjectID('03')
name: 'Italy',
capital: "Rome",
}

现在我知道聚合框架是用来生成单个文档的,在嵌套或深度嵌套数组的情况下,它可以完美地工作,但当涉及到像我这样的用例时,我想不出只应用一次聚合框架并填充所有引用的国家ID的方法,我尝试了以下方法

const allNodeProgrammers = await Programmers.aggregate([
{
$match: {
profession: profession,
},
},
{
$lookup: {
from: 'Country',
let: {
country: '$country',
},
pipeline: [
{
$match: {
$expr: { $eq: ['$_id', '$$country'] },
},
},
],
as: 'country',
},
},
]);
return allNodeProgrammers.toArray();

但不出所料,它只返回了第一个具有已填充countryID的匹配实例。

在这个特定的用例中找不到任何SO答案,像下面的链接一样应用了基本查找,但它只返回第一个匹配的实例,最接近的是这个SO问题,但它没有解决我的查询。我应该先获取所有结果,然后在数组中循环以填充国家ID,还是有其他方法来解决这个问题。任何帮助都将不胜感激,提前感谢

我在控制器文件中犯了一个错误,如下

res.status(200).json({
...allNodeProgrammers[0],
});

更改为以下修复

res.status(200).json({
...allNodeProgrammers,
});

最新更新