MongoDB - получить все элементы, соответствующие условию, в "глубоком" массиве - PullRequest
0 голосов
/ 06 мая 2020

Моя users коллекция содержит:

{
    _id: "1",
    posts: [
        {
            _id: "12",
            comments: [
                {
                    _id: "123",
                    userId: "5",
                    ...
                },
                ...
            ]
        },
        ...
    ]
},
...

Я хочу получить все комментарии, принадлежащие определенному c идентификатор пользователя (userId prop).

Как я могу достичь что?

Спасибо

1 Ответ

0 голосов
/ 06 мая 2020

вы можете попробовать это

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

...