вы можете попробовать это
db.collection.aggregate([
{
$match: {
"posts.comments.user": "userId1" // note that you need to use objectId here if the user property in the comments array is an objectId
}
},
{
$unwind: "$posts"
},
{
$project: {
"posts.comments": {
$filter: {
input: "$posts.comments",
as: "comment",
cond: {
$eq: [
"$$comment.user",
"userId1"
]
}
}
}
}
},
{
$group: {
_id: "$_id",
posts: {
$push: "$posts"
}
}
}
])
протестировать здесь Пн go Игровая площадка
> Обновить
вышеуказанный запрос получит массив документов, каждый документ имеет массив сообщений, и каждый элемент сообщения имеет массив комментариев
если вам нужен только массив комментариев, принадлежащий какому-то пользователю, тогда мы можем использовать что-то вроде этого
db.collection.aggregate([
{
$match: {
"posts.comments.user": "userId1"
}
},
{
$unwind: "$posts"
},
{
$project: {
"posts.comments": {
$filter: {
input: "$posts.comments",
as: "comment",
cond: {
$eq: [
"$$comment.user",
"userId1"
]
}
}
}
}
},
{
$unwind: "$posts.comments"
},
{
$group: {
_id: null,
comments: {
$push: "$posts.comments"
}
}
},
{
$project: {
_id: 0
}
}
])
и протестируйте здесь Пн go Детская площадка 2