Как получить объект в глубоко вложенном массиве в mongoose с использованием узлов

#arrays #mongodb #mongoose #nested #nodes

#массивы #mongodb #mongoose #вложенный #узлы

Вопрос:

В моей коллекции пользователей у меня есть следующее

 {
  _id: ObjectId('whatever user id'),
  movies: [
    {
      _id: ObjectId('whatever id of this movie'),
      name: 'name of this movie',
      actors: [
        {
          _id: ObjectId('whatever id of this actor'),
          name: 'name of this actor'
        }
      ]
    }
  ]
}
 

Итак, в моей коллекции пользователей я хочу иметь возможность запрашивать субъекта с помощью user.id , pet.id , и actor.id

Я хочу вернуть субъекта примерно так…

 actor: {
  fields...
}
 

Я попробовал следующее…

 const actor = await User.findById(req.user.id, {
  movies: {
    $elemMatch: {
      _id: req.params.movie_id,
      actors: {
        $elemMatch: {
          _id: req.params.actor_id,
        },
      },
    },
  },
});
 

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

Ответ №1:

Я смог понять это, используя aggregate . Я использовал это раньше, но, похоже, мне нужно было разыграть свой ids с mongoose.Types.ObjectId помощью, так что простое req.user.id не сработало бы.

Чтобы получить свой ответ, я так и сделал…

 const user = await User.aggregate([
  { $match: { _id: mongoose.Types.ObjectId(req.user.id) } },
  { $unwind: '$movies' },
  { $match: { 'movies._id': mongoose.Types.ObjectId(req.params.movie_id) } },
  { $unwind: '$movies.actors' },
  {
    $match: {
      'movies.actors._id': mongoose.Types.ObjectId(req.params.actor_id),
    },
  },
]);
 

Это не вернуло данные в следующем формате…

 actor: {
  fields...
}
 

но вместо этого возвращает его следующим образом…

 user: {
  movies: {
    actor: {
      fields...
    }
  },
  otherFields...
}
 

затем отправка ответа обратно…

 res.status(200).json({
  status: 'success',
  data: {
    actor
  }
})
 

дает тот формат, который я хотел. Тем не менее, я все равно хотел бы знать, как просто получить субъекта данных, не получая полного документа