如何从两个集合中使用这些猫鼬模式(Node Js)联接?

时间:2020-02-03 12:31:59

标签: node.js mongodb join mongoose

我有3个架构。我在节点js中的api是根据调查表matchedUsers获取用户数据。我成功地填充了匹配的用户数据。但是,如果ratingById是matchedusers Id,我也想在结果中添加评级架构中的评级。

 const RatingSchema = new mongoose.Schema({
      ratingDate: {
        type: Date,
        required: true
      },
      ratedById: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: true
      },
      ratingOfId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
      },
      rating: {
        type: Number
      },
      ratingComments: {
        type: String
      },
    });



const QuestionnaireSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  },

  matchedUsers: {
    type: [mongoose.Schema.Types.ObjectId],
    ref: "User"
  }
});



const UserSchema = new mongoose.Schema({
  type: {
    type: String
  },
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  username: {
    type: String,
    required: true
  }
});

请帮助我如何将评分数据添加到查询中。我的代码是-

router.get("/:id/matches", (req, res, next) => {
  Questionnaires.findById(req.query.questionnaireId)
    .populate({ path: "matchedUsers", model: "User" })
    .exec()
    .then(questionnaire =>
      res.json({ success: true, matches: questionnaire.matchedUsers })
    )
    .catch(err => {
      console.log(err);
      return res.json({ success: false, message: "Could not get matches." });
    });
});

1 个答案:

答案 0 :(得分:0)

您必须在查询中使用aggregate,并使用$lookup从另一个架构获取引用

首先,我们从User模式中获得用户的引用,然后为Rating模式中的每个user获得Rating的引用

 Questionnaires.aggregate([
     {
         $match:{
             _id:req.query.questionnaireId
         }
     },{
         $lookup:{
             from:'users',
             localField:'matchedUsers',
             foreignField:'_id',
             as:'user'
         }
     },{
         $unwind:{
             path:'$user',
             preserveNullAndEmptyArrays:true
         }
     },{
         $lookup:{
             from:'ratings',
             localField:'user._id',
             foreignField:'ratingById',
             as:'rating'
         }
     },{
         $unwind:{
             path:'$rating',
             preserveNullAndEmptyArrays:true
         }
     }
 ]);