#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
}
})
дает тот формат, который я хотел. Тем не менее, я все равно хотел бы знать, как просто получить субъекта данных, не получая полного документа