$ Suche nach ID in einem Array von Objekten

Sep 15 2020

Ich habe einige Modelle, die so aussehen:

const exerciseDetailSchema = new mongoose.Schema(
    {
        Translations: {
            Name: {
                en: { type: String, required: true },
                no: { type: String }
            }
        }
    }
);

const workoutDetailSchema = new mongoose.Schema(
    {
        Sets: {
            Exercises: [ WorkoutExercises ],
            Units: { type: String }
        }
    }
);

const WorkoutSets = new mongoose.Schema({
    Reps: { type: Number },
    Weight: { type: Number }
});

const WorkoutExercises = new mongoose.Schema({
    ExerciseId: { type: String, required: true },
    Sets: [ WorkoutSets ]
});

Grundsätzlich bestehen Workouts aus Sets, die einige Metadaten einschließlich Übungen enthalten. Diese Übungen sind ein Array, das aus Trainingssätzen besteht.

Ich versuche, eine Abfrage zu erstellen, die mir die Trainingsdetails einschließlich des Übungsnamens zurückgibt, damit sie folgendermaßen aussehen können:

{
   _id: "5f60dc1069c27c015ede4e3e",
   Sets: {
      Units: 'metric',
      Exercises: [
         {
            _id: "5f60dc1069c27c015ede4e3e",
            ExerciseId: "5f60c3b7f93d8e00a1cdf414",
            ExerciseName: {
               en: "Squat",
               no: "Knebøy"
            },
            Sets: [
               { _id: "5f60dc1069c27c015ede4e3f", Reps: 10 },
               { _id: "5f60dc1069c27c015ede4e40", Reps: 20 }
            ]
         }
      ]
   }
}

Dies wäre mit einer Beispielübung wie:

{
   _id: "5f60c3b7f93d8e00a1cdf414",
   Translations: {
      Name: {
         en: "Squat",
         no: "Knebøy"
      }
   }
}

Ich habe versucht, eine $ -Suche wie folgt zu verwenden:

const workout = await WorkoutDetail.aggregate([
        {
            $lookup: {
                from: ExerciseDetail.collection.name,
                localField: "Sets.Exercises.ExerciseId",
                foreignField: "_id",
                as: "ExerciseDetail"
            }
        }
]);

Aber es kehrt immer mit nur zurück: ExerciseDetail: []für den Teil, der "verbunden" werden soll. Kann jemand helfen, wie man dies richtig abfragt?

AKTUALISIEREN

Ich habe hier eine andere Frage zum Gruppieren dieser Daten gestellt und eine Antwort erhalten, die es perfekt gemacht hat. Hoffentlich kann es auch anderen helfen : MongoDB $ group (Mongo-Spielplatz)

Antworten

1 varman Sep 15 2020 at 17:31

Da Exerciseses sich um ein Array handelt, müssen Sie $unwinddas Array abflachen.

[
  {
    $unwind: "$Sets.Exercises" }, { $lookup: {
      from: "exerciseDetailSchema",
      localField: "Sets.Exercises.ExerciseId",
      foreignField: "_id",
      as: "ExerciseDetail"
    }
  }
]

Hinweis: Zur Umstrukturierung müssen Sie verwenden $group. Ich habe nicht gezeigt, seit Sie ein Problem mit hattenlookup

Arbeitender Mongo-Spielplatz