Узел Mongoose возвращает несколько массивов ссылочных объектов из документа - PullRequest
0 голосов
/ 06 марта 2019

Я работаю над бэкэнд-API узла с mongoose. У меня есть 2 схемы: одна схема пользователя и одна схема Follow (сохраняется как пользователи и следует в монго). В следующих полях схемы подписчиков и последующих содержатся массивы идентификаторов объектов, которые ссылаются на объекты пользователя. Я пытаюсь вернуть объекты, на которые есть ссылки, в массивах, чтобы я мог ответить клиентом объектом, который содержит массив userFollowing и userFollowers, содержащий пользовательские объекты, но я не могу заполнить вывод.

Мне также нужно будет отфильтровать возвращаемые объекты, чтобы они возвращали только 'username bio image email first_name surname join_date'.

Мой текущий неверный вывод ниже. Я не уверен, что это ошибка в моем запросе или я использую правильный подход.

[{_id: 5c7dc1b92f3f1dd8ad9df993, пользователь: 5c7d93b57a29ce05a096c492, userFollowing: [], userFollowers: []}]

var mongoose = require('mongoose');

let Schema = mongoose.Schema;

var FollowSchema = new Schema({
  user: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  followers: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  following: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }]
}, { toJSON: { virtuals: true } }
);
 
module.exports = mongoose.model('Follow', FollowSchema);

// username must be unique and is required
var UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true
  },
  email: {
    type: String,
    unique: true,
  },
  first_name: {
    type: String,
    required: true
  },
  surname: {
    type: String,
    required: true
  },
  join_date: {
    type: Date,
    default: Date.now
  },
  bio: {
    type: String,
    default: 'Tell me about yourself'
  },
  image:{
    type: String,
    default: 'profile.jpg'
  },
  password: {
    type: String,
    required: true
  }

});

User.findOne({
    'username': username
  }, function (err, user) {
    if (!user) {
      return res.json({
        'state': false,
        'msg': `No user found with username ${username}`
      })
    } else {
      const user_id = user._id;
      Follow.aggregate([{
          $match: {
            "user": mongoose.Types.ObjectId(user_id)
          }
        },
        {
          $lookup: {
            "from": "follows",
            "localField": "following",
            "foreignField": "_id",
            "as": "userFollowing"
          }
        },
        {
          $lookup: {
            "from": "follows",
            "localField": "followers",
            "foreignField": "_id",

            "as": "userFollowers"
          }
        }, {
          $project: {
            "user": 1,
            "userFollowers": 1,
            "userFollowing": 1
          }
        }
      ]).exec(function (err, doc) {
        console.log(doc);
        res.json({
          'state': true,
          'msg': 'Follow list',
          'doc': doc
        })
      })
    }
  })
...