Mongodb $lookup嵌套数组对象的聚合
我有Mongodb $lookup嵌套数组对象的聚合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有category集合,其中包含子类别嵌入对象。我需要编写聚合脚本,以便首次从该集合查找到storelisting集合。然后将storelisting字段添加到相应的子类别中 类别 门店列表 我需要查找集合上面的表单到storeListing集合。我还需要storeListing的所有字段 结果应该如下所示: { "_id": "", "categoryName": "", "subCateg
category
集合,其中包含子类别嵌入对象。我需要编写聚合脚本,以便首次从该集合查找到storelisting
集合。然后将storelisting字段添加到相应的子类别中
类别
门店列表
我需要查找集合上面的表单到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": ""
}
解释
storeListingId
执行$lookup
,并将结果存储在tmp
字段中子类别
对象与商店列表
值合并$mergeObjects
是为了避免命名子类别中的每个字段
$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" ]
}
}
}
}
]
}
}
}
}
}
])
这个问题不够清楚。。你需要加入哪个系列?
storeListingName
和其他人是怎么来的?@varman我们有两个集合类别和storelisting,我们需要加入category和storelisting。要加入这个,我们需要检查“subCategories.storeListingIds”中的ID。storeListingName属性来自storeListing集合。这是storelisting集合的文档:{“_id”:“4”,“storeListingName”:“storeListingUrl”:“CatalogEIDS”:[“”],“_类”:“}
$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" ]
}
}
}
}
]
}
}
}
}
}
])