Хотите запрос, чтобы получить данные в мангусте с агрегатом, поиском и проектом - PullRequest
0 голосов
/ 27 декабря 2018

Схема пользователя выглядит следующим образом:

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