mongodb - 嵌套数组对象的 $lookup 聚合
问题描述
我有category
包含子类别嵌入对象的集合。我需要编写聚合脚本来首先从这个集合查找到storelisting
集合。然后将商店列表字段添加到相应的子类别中。
类别
{
"_id": "",
"categoryName": "",
"subCategories": [
{
"subCategoryId": "",
"subCategoryName": "",
"storeListingIds": [
"1",
"2"
]
},
{
"subCategoryId": "",
"subCategoryName": "",
"storeListingIds": [
"3","4","5"
]
}
],
"order": 2,
"createdAt": {
"$date": "2020-12-01T22:26:11.669Z"
},
"updatedAt": {
"$date": "2021-04-27T17:17:25.442Z"
},
"_class": ""
}
入店
{
"_id": "1",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "2",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "3",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "4",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "5",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
}
我需要在集合上方查找表单到 storeListing 集合。我也想要 storeListing 的所有字段。
结果应如下所示:
{
"_id": "",
"categoryName": "",
"subCategories": [
{
"subCategoryId": "",
"subCategoryName": "",
"storeListingIds": [
"1",
"2"
],
"storeListings":[
{
"_id": "1",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "2",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
}
]
},
{
"subCategoryId": "",
"subCategoryName": "",
"storeListingIds": [
"3","4","5"
],
"storeListings":[
{
"_id": "3",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "4",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
},
{
"_id": "5",
"storeListingName": "",
"storeListingUrl": "",
"catalogueIds": [
""
],
"_class": ""
}
]
}
],
"order": 2,
"createdAt": {
"$date": "2020-12-01T22:26:11.669Z"
},
"updatedAt": {
"$date": "2021-04-27T17:17:25.442Z"
},
"_class": ""
}
解决方案
解释
- 我们执行
$lookup
嵌套storeListingId
并将结果存储在tmp
字段中 - 我们应用过滤并将
subCategories
对象与storeListings
值合并
注意:我们使用的原因$mergeObjects
是为了避免命名中的每个字段subCategories
$map: {
input: "$subCategories",
as: "subCat",
in: {
subCategoryId:"$$subCat.subCategoryId",
subCategoryName:"$$subCat.subCategoryName",
storeListingIds: "$$subCat.storeListingIds",
storeListening: {
$filter: {
input: "$tmp",
cond: {
$in: [ "$$this._id", "$$subCat.storeListingIds" ]
}
}
}
}
}
试试这个:
db.category.aggregate([
{
$lookup: {
from: "storelisting",
localField: "subCategories.storeListingIds",
foreignField: "_id",
as: "tmp"
}
},
{
$addFields: {
tmp: "$$REMOVE",
subCategories: {
$map: {
input: "$subCategories",
as: "subCat",
in: {
"$mergeObjects": [
"$$subCat",
{
storeListings: {
$filter: {
input: "$tmp",
cond: {
$in: [ "$$this._id", "$$subCat.storeListingIds" ]
}
}
}
}
]
}
}
}
}
}
])
推荐阅读
- python-3.x - 从字符串中去除不需要的字符
- python - 如何添加建议的帖子
- html - 如何在手机的浏览器上正确调整大小?
- python - 从 Python 中的数据集中删除 1SD 值(异常值检测)
- python - Python:如何将 3 个函数合并为一个(用于生成数字计数器)
- sql-server - PowerBI中的小数问题
- jwt - 代币发行日期增加 8 小时
- javascript - 使用 node.js 创建显示文本的图像
- c# - ClickOnce 发布错误。复制 dll.deploy 文件失败
- r - 在 Mac 上安装 bife 包时出错:RcppArmadillo