在 mongodb 中加入多个集合并保留所有字段



我是NoSQL数据库的新手,我对集合聚合有点困惑。这是我正在尝试做的:我有三个集合:productCollectiondetailsCollectionbrandCollection.
productCollection具有以下字段:_idnamedetails
detailsCollection_idbrand
brandCollection_idname

这些集合还有其他领域,但这些对我来说是最有趣的。正如您可能猜到的,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同时出现在productCollectionbrandCollection中。所有其他字段都可以.
因此,我的问题是:如何使brandCollectionname也出现在结果中?也许我可以在此过程中重命名它以以另一个名称显示?有没有更简单的方法加入这三个集合?还是上面的脚本很好?

感谢您的任何帮助!

  • $lookupwithdetailsCollection集合
  • $lookupbrandCollection并将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"
}
}
])

操场

相关内容

  • 没有找到相关文章

最新更新