我如何才能在不丢失原始结构的情况下重建这个深深展开的物体?

时间:2019-04-23 22:34:43

标签: mongodb express mongoose

几周前,我一直在与mongodbexpress合作。我尝试通过$lookup选项使用聚合来引用数据。因此,我应用$unwind,一切正常。下一步是重新创建数组。


这是$unwind步骤和$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 } },

第一级很容易,我这样做:

{
    // 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
        "...":"..."
    }
}

我的问题来自于更深层次的阵列。如何用最深的阵列实现这一目标?


编辑

原始文件

    {
  "_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文档示例$lookup

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

    ],
}

部门示例(最深的$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
}

1 个答案:

答案 0 :(得分:0)

Pude解析器问题。 Era muchomássencillo de lo queparecía。

实用程序:

{
        $group: {
            _id: "$folioLineas._id",

            folio: {
                //   Este es para preservar la información del folio.
                $first: "$$ROOT"
            },
            pedido: {
                $first: "$$ROOT.folioLineas"
            },

            procesos: {
                $push: "$folioLineas.modeloCompleto.familiaDeProcesos.procesos"
            }
        }
    },

    {
        $addFields: {
            // Anadimos los procesos a la familia sustituyendo
            // Los que actualmente tiene
            "pedido.modeloCompleto.familiaDeProcesos.procesos": "$$ROOT.procesos"
        }
    },

    {
        //   Ahora agrupamos todo por el id del folio para que los pedidos
        // que tengan el mismo folio queden juntos.
        $group: {
            _id: "$$ROOT.folio._id",
            folio: { $first: "$$ROOT.folio" },
            //   Hace que los pedidos de un mismo folio se agrupen
            // bajo el mismo arreglo.
            pedidos: {
                $push: "$$ROOT.pedido"
            }
        }
    },

    {
        //   Sobreescribimos los pedidos del folio
        // con los que habiamos modificado
        $addFields: {
            "folio.folioLineas": "$$ROOT.pedidos"
        }
    },

    {
        // Por ultimo hacemos que que la estructura principal sea el folio que estaba
        // en el grupo. Esta función ignora las propiedades _id y pedidos que
        // estábamos arrastrando y pone como raíz el folio. Esto aplica para
        // cada uno de los los folios de manera que obtenemos el arreglo de folios
        // que teníamos al principio.
        $replaceRoot: { newRoot: "$folio" }
    }