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?.