每个项目的猫鼬查找ID?

时间:2020-07-01 10:32:39

标签: node.js mongodb mongoose

我收集了一些锻炼-每个锻炼都有对WorkoutCategoryId的引用。但是,API不仅应该返回categoryId,还应该返回整个类别。因此,我需要以某种方式从WorkoutCategoryId中查找WorkoutCategory,并进行填充。

现在,我正在查找与客户相关的所有锻炼:

let workouts = await Workout.find({
       clientId: clientId
});
if(workouts) {
   return workouts
}

太好了,所有这些都可以正常工作,但是正如我所写的,这将返回一个锻炼数组:

0: {_
  id: "5efc518032844e24c74371ec", name: "A name2", createdBy: "5ee75b17558756773c2dd4b1",…}
  clientId: "5ef08f6b25fbdc481b01a82b"
  createdBy: "5ee75b17558756773c2dd4b1"
  workoutCategoryId: "5ee75b17558756773c2dd4b9"
  name: "A name2"
},
1: {_
  id: "5efc518032844e24c74371ec", name: "A name2", createdBy: "5ee75b17558756773c2dd4b1",…}
  clientId: "5ef08f6b25fbdc481b01a82b"
  createdBy: "5ee75b17558756773c2dd4b1"
  workoutCategoryId: "5ee75b17558756773c2dd4b9"
  name: "A name2"
}

所以我的问题是,我应该如何扩展它,以便在我回答的每个项目中也获得实际的trainingCategory?

我在锻炼中尝试使用.map(),并尝试扩展对象,但无法完全正常工作...

workouts = workouts.map((workout) => {
                let workoutCategoryId = workout.workoutCategoryId;
                WorkoutCategory.find({_id: workoutCategoryId}).then((category) => {
                    workout.category = category
                });
                return workout;
            })

我看过一些关于有人建议使用$ lookup的.aggregate()的文章,但是我不能完全包住头,并且有点卡住:(

1 个答案:

答案 0 :(得分:0)

使用填充。假设“ workoutCategoryId”存储了引用WorkoutCategory模型的objectId。

Workout.find({
    clientId: clientId
})
.populate('workoutCategoryId')
.exec(function(err, workout){

})

使用查找。试试这个。

Workout.aggregate([
    {
        $match: {clientId: clientId}
    },
    {
        $lookup: {from: "WorkoutCategory", localField: "workoutCategoryId", foreignField: "_id", as: "workoutCategory"}
    }
], (err, w) => {
    console.log(w)
})

在“ w”中,它将存储为executionCategory(数组)。