Как объединить две коллекции с этими схемами mon goose (Node Js)? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть 3 схемы. Мой API в node js - это выборка пользовательских данных в соответствии с вопросником matchedUsers. Я добился успеха в том, что он заполняет данные соответствующих пользователей. Но я также хочу добавить рейтинги из схемы рейтинга в результат, если ratingById - это идентификатор matchedusers.

 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 голосов
/ 03 февраля 2020

Вы должны будете использовать 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
         }
     }
 ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...