几周前,我一直在与mongodb
和express
合作。我尝试通过$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
}
$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
}
答案 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" }
}