आपको मूल रूप से $unwind
की आवश्यकता है
पहले सरणी। MongoDB अभी तक $lookup
।
साथ ही दक्षता के लिए हमें वास्तव में $concatArrays
का उपयोग करना चाहिए।
पहले सरणी स्रोत को "शामिल" करें, और उसके बाद केवल एक . करें $lookup
ऑपरेशन:
Project.aggregate([
{ "$match": { "project_id": projectId} },
{ "$project": {
"project_id": 1,
"updated_at": 1,
"created_at": 1,
"owner": 1,
"name": 1,
"combined": {
"$concatArrays": [
{ "$map": {
"input": {
"$filter": {
"input": "$uploaded_files",
"as": "uf",
"cond": { "$eq": ["$$uf.upload_id", uploadId ] }
}
},
"as": "uf",
"in": {
"$arrayToObject": {
"$concatArrays": [
{ "$objectToArray": "$$uf" },
[{ "k": "type", "v": "uploaded_files" }]
]
}
}
}},
{ "$map": {
"input": {
"$filter": {
"input": "$file_history",
"as": "fh",
"cond": { "$eq": ["$$fh.upload_id", uploadId ] }
}
},
"as": "fh",
"in": {
"$arrayToObject": {
"$concatArrays": [
{ "$objectToArray": "$$fh" },
[{ "k": "type", "v": "file_history" }]
]
}
}
}}
]
}
}},
{ "$unwind": "$combined" },
{ "$lookup": {
"from": "files",
"localField": "combined.file",
"foreignField": "_id",
"as": "combined.file"
}},
{ "$unwind": "$combined.file" },
{ "$lookup": {
"from": "users",
"localField": "owner",
"foreignField": "_id",
"as": "owner"
}},
{ "$unwind": "$owner" },
{ "$group": {
"_id": "$_id",
"project_id": { "$first": "$project_id" },
"updated_at": { "$first": "$updated_at" },
"created_at": { "$first": "$created_at" },
"owner": { "$first": "$owner" },
"name": { "$first": "$name" },
"combined": { "$push": "$combined" }
}},
{ "$project": {
"project_id": 1,
"updated_at": 1,
"created_at": 1,
"owner": 1,
"name": 1,
"uploaded_files": {
"$filter": {
"input": "$combined",
"as": "cf",
"cond": { "$eq": [ "$$cf.type", "uploaded_files" ] }
}
},
"file_history": {
"$filter": {
"input": "$combined",
"as": "cf",
"cond": { "$eq": [ "$$cf.type", "file_history" ] }
}
}
}}
])
संक्षेप में
-
स्रोत पर दो सरणियों को एक साथ लाएं और उन्हें टैग करें, फिर
$unwind
पहले -
$lookup
करें संयुक्त विवरण और$unwind
पर वह -
$lookup
करें दूसरे विदेशी स्रोत पर और$unwind
वह -
$group
दस्तावेज़ एक ही सरणी के साथ वापस एक साथ। -
$filter
"टैग नाम" या "प्रकार" फ़ील्ड द्वारा हमने सरणियों को "अलग" करने के लिए जोड़ा।
आप उसी तरह की प्रक्रिया का पालन कर सकते हैं बस बस $unwind
. का उपयोग कर रहे हैं प्रत्येक सरणी पर, फिर "जुड़ें" और एक साथ वापस समूह बनाना। लेकिन वास्तव में इसके लिए पहले स्थान पर केवल "संयोजन" करने की तुलना में बहुत अधिक चरणों की आवश्यकता है।