Using mongoose, I have a problem with the method populate

67 views Asked by At

I'm using mongoose in my nextjs application and I have a problem with the method populate in a specific case. Let me explain with my code below :

Here's my code : 1st Model

import mongoose, { Schema } from "mongoose";

const muscleSchema = new Schema(
  {
    name: {
      type: String,
      required: [true, "Name is required"],
      trim: true,
      enum: ['legs', 'glutes', 'back', 'abs', 'pectorals', 'arms', 'shoulders'],
    },
  }
);

const Muscle = mongoose.models.Muscle || mongoose.model("Muscle", muscleSchema)

export default Muscle;

2nd Model :

import mongoose, { Schema } from "mongoose";

const exerciseSchema = new Schema(
  {
    name: {
      type: String,
      required: [true, "Name is required"],
      trim: true,
    },
    muscle: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Muscle',
      required: true,
    }
  }
);

const Exercise = mongoose.models.Exercise || mongoose.model("Exercise", exerciseSchema)

export default Exercise;

And here's my 'exercise' route api to get ONE Exercice :

export async function GET(request, { params }) {
  try {
    const { id } = params;
    await connectDb();
    const exercise = await Exercise.findById(id);
    await exercise.populate({ path: "muscle", select: "name" });
    console.log(exercise)
    return NextResponse.json(exercise, { status: 200 });
  } catch (err) {
    const { errors } = err;
    return NextResponse.json(errors, { status: 404 });
  }
}

It works perfectly fine and I get this :

{
    "_id": "6559e924d02b9f36fd7f574d",
    "name": "squats",
    "muscle": {
        "_id": "65101d9667cb93cb766bfe79",
        "name": "legs"
    },
    "__v": 0
}

But when I want to get SOME exercices by muscle id with this route, populate dosen't seem to work:

export async function GET(request, { params }) {
  try {
    const muscle_id = request?.url.split("=")[1];
    await connectDb();
    const findExercises = async () => {
      if (muscle_id) {
        console.log(muscle_id);
        return Exercise.find({ muscle: muscle_id });
      }
      return Exercise.find();
    };
    console.log("before", await findExercises());
    const exercises = await findExercises();
    exercises.map(async (exercice) => {
      return await exercice.populate({
        path: "muscle",
        select: "name",
      });
    });
    console.log("after", exercises);
    return NextResponse.json(exercises, { status: 200 });
  } catch (err) {
    const { errors } = err;
    return NextResponse.json(errors, { status: 404 });
  }
}

Here's my response :

[
    {
        "_id": "6559e924d02b9f36fd7f574d",
        "name": "squats",
        "muscle": "65101d9667cb93cb766bfe79",
        "__v": 0
    },
    {
        "_id": "6559f1f2d02b9f36fd7f57ab",
        "name": "deadlift",
        "muscle": "65101d9667cb93cb766bfe79",
        "__v": 0
    }
]

But I should have something like that :

[
    {
        "_id": "6559e924d02b9f36fd7f574d",
        "name": "squats",
        "muscle": {
        "_id": "65101d9667cb93cb766bfe79",
        "name": "legs"
    },
        "__v": 0
    },
    {
        "_id": "6559f1f2d02b9f36fd7f57ab",
        "name": "deadlift",
        "muscle": {
        "_id": "65101d9667cb93cb766bfe79",
        "name": "legs"
    },
        "__v": 0
    }
]

Can anyone help me?.

0

There are 0 answers