Você basicamente precisa
$unwind
a matriz primeiro. O MongoDB ainda não pode trabalhar com a propriedade "inner" de um objeto dentro de um array como fonte para $lookup
. Também para eficiência, devemos usar
$concatArrays
primeiro para "juntar" a fonte da matriz e, em seguida, faça apenas uma $lookup
Operação: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" ] }
}
}
}}
])
Em poucas palavras
-
Junte os dois arrays na fonte e marque-os, então$unwind
primeiro
-
Faça o$lookup
nos detalhes combinados e$unwind
este
-
Faça o$lookup
na outra fonte estrangeira e$unwind
este
-
$group
o documento de volta junto com uma única matriz.
-
$filter
pelo campo "tag names" ou "type" que adicionamos para "separar" os arrays.
Você pode seguir o mesmo tipo de processo simplesmente usando
$unwind
em cada array, fazendo o "join" e agrupando novamente. Mas realmente isso precisa de muito mais etapas, do que simplesmente "combinar" em primeiro lugar.