Схема пользователя выглядит следующим образом:
const UserSchema = new Schema({
username: {
type: String,
required: true
},
communities: [ UserCommunitiesSchema ],
createdAt: {
type: Date,
default: Date.now
}
});
ChildSchema для пользователя:
const UserCommunitiesSchema = new Schema({
community: { type: schema.Types.ObjectId, ref: 'CommunitySchema' },
role: { type: String, enum: ['admin','member'], default: 'member' }
}, { _id: false });
CommunitySchema, как показано ниже:
const CommunitySchema = new Schema({
admin: {
type: schema.Types.ObjectId,
ref: 'UserSchema'
},
title: {
type: String,
required: true,
min: 5,
max: 200
},
members: [{
member: { type: schema.Types.ObjectId, ref:'UserSchema' },
joinedAt: { type: Date, default: Date.now() }
}],
createdAt: { type: Date, default: Date.now() },
});
Фактический результат:
{
"_id": "ObjectId(User)",
"username": "username",
"communities": [
{
"role": "admin",
"community": "ObjectId(Comm1)"
},
{
"role": "member",
"community": "ObjectId(Comm2)"
}
],
}
Я хочу, чтобы информация о пользователе возвращалась со следующими даннымиГде внутри ключа communities
Я хочу получить подробную информацию для каждого сообщества и сохранить его под ключом community
.Также я хочу, чтобы role
каждого сообщества было сохранено как есть.Я попытался следующий код, но он заменяет сообщества в ответ:
Код, который я пробовал:
UserSchema
.aggregate([
{ $match: { _id: new mongoose.Types.ObjectId(req.params.id) } },
{ $lookup: {
from: 'CommunitySchema',
let: { communities: "$communities" },
pipeline: [
{
$match: {
$expr: {
$in: ['$_id', '$$communities.community']
}
}
},
{ $project: {
_id: 1,
title: 1,
membersCount: { $size: '$members' },
}}
],
as: 'communities'
}},
]).then(user => console.log(user))
.catch(error => console.log(error));
Ожидаемый результат:
{
"_id": "ObjectId(User)",
"username": "username",
"communities": [
{
"role": "admin",
"community": {
"_id": "ObjectId(Comm1)",
"title": "Comm1Title",
"membersCount": 10
}
},
{
"role": "member",
"community": {
"_id": "ObjectId(Comm2)",
"title": "Comm2Title",
"membersCount": 5
}
}
],
}