MongoDB $ group (parque infantil de mongo)

Sep 16 2020

He hecho una pregunta aquí sobre el operador de desenrollado $, pero tengo problemas para agrupar los datos correctamente después.

Tengo un patio de juegos de mongo con un ejemplo, pero aquí está también. Después de una $unwind, $lookupy $groupen la consulta (¿tal vez hay una forma mejor y más eficiente de hacerlo?), Me quedo con estos datos:

[
  {
    "ExerciseDetail": [
      [{ "Name": "Squat", "_id": "5f60c3b7f93d8e00a1cdf414" }],
      [{ "Name": "Deadlift", "_id": "5f60c3b7f93d8e00a1cdf415" }]
    ],
    "Sets": [
      {
        "ExerciseId": "5f60c3b7f93d8e00a1cdf414",
        "Sets": [],
        "WorkoutExerciseId": "5f60dc1069c27c015ede4e3e"
      },
      {
        "ExerciseId": "5f60c3b7f93d8e00a1cdf415",
        "Sets": [],
        "WorkoutExerciseId": "5f60dc1069c27c015ede4e34"
      }
    ],
    "_id": "5f60dc1069c27c015ede4e3e"
  }
]

Sin embargo, lo que quiero hacer es que cada uno de los objetos de detalle de ejercicio se agreguen al objeto de conjuntos respectivo, según el ID de ejercicio equivalente, de modo que el resultado final se vea así:

{
     "_id": "5f60dc1069c27c015ede4e3e",
     "Sets": [
        {
           "ExerciseId": "5f60c3b7f93d8e00a1cdf414",
           "Name": "Squat",
           "Sets": [],
           "WorkoutExerciseId": "5f60dc1069c27c015ede4e3e"
        },
        {
           "ExerciseId": "5f60c3b7f93d8e00a1cdf415",
           "Name": "Deadlift",
           "Sets": [],
           "WorkoutExerciseId": "5f60dc1069c27c015ede4e34"
        }
     ]
}

¿Alguien puede ayudar con la agrupación adecuada? (y si ves una mejor manera de$unwind, $buscar también?)

Respuestas

1 mickl Sep 16 2020 at 04:18

Necesitas dos etapas adicionales. En primer lugar, puede ejecutar $ reduce para aplanar, ExerciseDetailque ahora es una matriz de matrices. Una vez hecho esto, puede ejecutar $ map con $ filter anidado para emparejarse Setscon ExerciseDetails:

{
    $addFields: {
        ExerciseDetail: {
            $reduce: { input: "$ExerciseDetail",
                initialValue: [],
                in: {
                    $concatArrays: [ "$$value", "$$this" ] } } } } }, { $project: {
        _id: 1,
        Sets: {
            $map: { input: "$Sets",
                as: "set",
                in: {
                    $let: { vars: { exDetail: { $arrayElemAt: [
                                    { $filter: { input: "$ExerciseDetail", cond: { $eq: [ "$$this._id", "$$set.ExerciseId" ] } } }, 0 ] } }, in: { $mergeObjects: [
                                "$$set", "$$exDetail"
                            ]
                        }
                    }
                }
            }
        }
    }
}

Parque infantil Mongo