我是NoSQL数据库的新手,我对集合聚合有点困惑。这是我正在尝试做的:我有三个集合:productCollection
、detailsCollection
和brandCollection
.productCollection
具有以下字段:_id
,name
,details
detailsCollection
有_id
和brand
brandCollection
有_id
和name
这些集合还有其他领域,但这些对我来说是最有趣的。正如您可能猜到的,productCollection
中的details
是指detailsCollection
中的_id
,而detailsCollection
中的brand
是对brandCollection
中_id
的引用。我需要的是获得产品及其品牌的集合。所以,基本上,我需要加入这三个集合,并从productCollection
中提取name
,从brandCollection
中提取name
到目前为止,我设法编写了这个脚本:
db.productCollection.aggregate([
{
$lookup: {
from: "detailsCollection",
localField: "details",
foreignField: "_id",
as: "det"
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$det", 0 ] }, "$$ROOT" ] } }
},
{ $project: { "det": 0 } },
{
$lookup: {
from: "brandCollection",
localField: "brand",
foreignField: "_id",
as: "br"
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$br", 0 ] }, "$$ROOT" ] } }
},
{ $project: { "br": 0 } }
])
它向我显示了所有三个系列中的所有字段,但没有显示品牌名称。我认为这可能是因为该字段name
同时出现在productCollection
和brandCollection
中。所有其他字段都可以.
因此,我的问题是:如何使brandCollection
name
也出现在结果中?也许我可以在此过程中重命名它以以另一个名称显示?有没有更简单的方法加入这三个集合?还是上面的脚本很好?
感谢您的任何帮助!
$lookup
withdetailsCollection
集合$lookup
brandCollection
并将localField
作为品牌 ID 传递$arrayElemAt
从结果中获取第一个元素brand
- 删除不再需要
details
字段
db.productCollection.aggregate([
{
$lookup: {
from: "detailsCollection",
localField: "details",
foreignField: "_id",
as: "brand"
}
},
{
$lookup: {
from: "brandCollection",
localField: "brand.brand",
foreignField: "_id",
as: "brand"
}
},
{
$addFields: {
brand: {
$arrayElemAt: ["$brand.name", 0]
},
details: "$$REMOVE"
}
}
])
操场