Я работаю над бэкэнд-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
})
})
}
})