'How I can reconstruct this deeply unwind object without lost original structure?

I been working with mongodb and express a few weeks ago. I try to use aggregation to reference data with the $lookup option. So I apply $unwind and everything works fine. The next step is recreate the array.


This is the code for the $unwind steps and $lookup

  // Separamos las lineas
        { $unwind: { path: "$folioLineas", preserveNullAndEmptyArrays: true } },
        // Cargamos el id de la familia
        {
            $lookup: {
                from: "familiadeprocesos",
                localField: "folioLineas.modeloCompleto.familiaDeProcesos",
                foreignField: "_id",
                as: "folioLineas.modeloCompleto.familiaDeProcesos"
            }
        },
        // Hack para que familia sea un objeto. 
        { $unwind: { path: "$folioLineas.modeloCompleto.familiaDeProcesos", preserveNullAndEmptyArrays: true } },
        // Separamos los procesos
        { $unwind: { path: "$folioLineas.modeloCompleto.familiaDeProcesos.procesos", preserveNullAndEmptyArrays: true } },

        {
            $lookup: {
                from: "procesos",
                localField: "folioLineas.modeloCompleto.familiaDeProcesos.procesos.proceso",
                foreignField: "_id",
                as: "folioLineas.modeloCompleto.familiaDeProcesos.procesos.proceso"
            }
        },
        // Hack para que proceso sea un objeto. 
        { $unwind: { path: "$folioLineas.modeloCompleto.familiaDeProcesos.procesos.proceso", preserveNullAndEmptyArrays: true } },
        // Cargamos los departamentos
        {
            $lookup: {
                from: "departamentos",
                localField: "folioLineas.modeloCompleto.familiaDeProcesos.procesos.proceso.departamento",
                foreignField: "_id",
                as: "folioLineas.modeloCompleto.familiaDeProcesos.procesos.proceso.departamento"
            }
        },
        // Hack para que departamento sea un objeto. 
        { $unwind: { path: "$folioLineas.modeloCompleto.familiaDeProcesos.procesos.proceso.departamento", preserveNullAndEmptyArrays: true } },

The first level is very easy, I do this:

{
    // Una vez que cargamos los datos ahora hay que volver a agrupar. Primero hacemos un grupo
    // que contenga todos los datos del folio. Este es el id. En este grupo tambien se agregan
    // Las folio lineas.



    $group: {
        _id: {
            _id: "$_id",
            nivelDeUrgencia: "$nivelDeUrgencia",
            ordenesGeneradas: "$ordenesGeneradas",
            //More properties
            "...":"..."
        },

        folioLineas: { $push: "$folioLineas" },

    }
},


// Proyectamos todo para volver a tener la estructura original.

{
    $project: {
        _id: "$_id._id",
        nivelDeUrgencia: "$_id.nivelDeUrgencia",
        ordenesGeneradas: "$_id.ordenesGeneradas",

        folioLineas: "$folioLineas",
        //More properties
        "...":"..."
    }
}

My problems come with arrays that are deeper. How can I achieve this with the most deepest arrays?


EDIT

Original document

    {
  "_id": "5cbf88af36c14f62ac032aea",
  "nivelDeUrgencia": "PRODUCCIÓN",
  "ordenesGeneradas": false,
  "impreso": false,
  // More properties
  "...": "...",
  // $unwind here
  "folioLineas": [
    {
      "_id": "5cbf893ce41a853d183501ac",
      // More properties
      "...": "...",
      "modeloCompleto": {
        // More properties
        "...": "...",
        "versionModelo": "",
        // $Lookup here
        "familiaDeProcesos": "5c79adc443aa6a4ff076ed14",
        "procesosEspeciales": [],
        "lotes": [],
        "nombreCompleto": "2505-16-1 GIS-B",
        "existencia": 0,
        "__v": 0,
        "esBaston": false
      },
      "cantidad": 1000,
      "laserCliente": {
        "imagenes": [],
        "_id": "5cbf88af36c14f62ac032aee"
      },
      "createdAt": "2019-04-23T22:57:56.101Z",
      "updatedAt": "2019-04-23T22:57:56.101Z",
      "porcentajeAvance": 0,
      "coloresTenidos": [],
      "pedido": "74-0",
      "procesos": [],
      "fechaTerminado": null,
      "observaciones": "PEDIDO 0 DEL FOLIO 74. OBSERVACION PRODUCCION ",
      "observacionesVendedor": "Pedido 0 2505-16-1 GIS-B 1000 PZ",
      "ordenes": [
        {
          "nivelDeUrgencia": "PRODUCCIÓN",
          "_id": "5cbf89b6e41a853d183501e2",
          // More properties
          "...": "..."
        }
      ]
    }
  ],
  "porcentajeAvance": 0,
  "cantidadProducida": 0,
  "fechaTerminado": null,
  "fechaDeEntregaAProduccion": "2019-04-23T21:53:15.956Z",
  "entregarAProduccion": true
}

FamiliaDeProcesos document example $lookup

{
    "_id" : "5c79adc443aa6a4ff076ed14",
    "nombre" : "PRUEBA 1",
    "observaciones" : "FAMILIA PARA PRUEBAS",
    // $unwind here.
    "procesos" : [ 
        {
            "_id" : "5c8c02b7fd9217686ce899fb",
            "orden" : 0,
            // $lookup here
            "proceso" : "5c6f1578e36c3f0e10ae9497"
        }, 

    ],
}

Departamento example (the most deeper $lookup) :D

{
    "_id" "5c6f1578e36c3f0e10ae9496",
    "maquinas" : [],
    "gastos" : [],
    "departamento" :"5c6f1578e36c3f0e10ae948a",
    "nombre" : "LASERADO DE BOTON.",
    "observaciones" : "Este proceceso se utiliza cuando el pedido se senala como \"laserar boton\"",
    "requiereProduccion" : false,
    "__v" : 0
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source