как преобразовать данные с 3 коллекциями и $ looup - PullRequest
0 голосов
/ 18 июня 2020

У меня есть три коллекции, которые хотели получить базы данных по их ссылочному идентификатору, я получил результат, но хотел преобразовать данные, как это сделать.

 db.post.aggregate([
      {
        $lookup: {
          from: "users",
          localField: "created_by",
          foreignField: "_id",
          as: "users"
        }
      },
      {
        $lookup: {
          from: "comments",
          let: {
            p_id: "$_id"
          },
          pipeline: [
            {
              $match: {
                $expr: {
                  $eq: [
                    "$post_id",
                    "$$p_id"
                  ]
                }
              }
            }
          ],
          as: "comments"
        }
      },
      {
        $lookup: {
          from: "users",
          localField: "comments.sender_id",
          foreignField: "_id",
          as: "commented_user"
        }
      },

    ])

Я получаю этот результат, но то, что хочу объединить commented_user с комментариями означает, что у кого есть комментарии, получить запись.

[
  {
    "_id": ObjectId("5eeb02881982961ada625c7d"),
    "commented_user": [
      {
        "_id": ObjectId("5e4d0973babf2b74ca868f4d"),
        "first_name": "James",
        "last_name": "Smith",
        "timestamp": 1.582106995137e+12
      }
    ],
    "comments": [
      {
        "_id": ObjectId("5eeb08e26fb7f270e4077617"),
        "date": 1.592461538923e+12,
        "post_id": ObjectId("5eeb02881982961ada625c7d"),
        "sender_id": ObjectId("5e4d0973babf2b74ca868f4d"),
        "text": "Nice One "
      }
    ],
    "created_by": ObjectId("5e4e74eb380054797d9db623"),
    "created_users": [],
    "date": 1.589441206774e+12,
    "title": "Covid19"
  }
]

Было бы лучше, если бы я получил каждую прокомментированную деталь под комментариями, как показано ниже? https://mongoplayground.net/p/uw0kMTChFa0

1 Ответ

0 голосов
/ 18 июня 2020

Вы можете использовать $ set и $ unset или $ project для форматирования выходных данных

Пример с unset или Пример с проектом

Обновлено Пример . Вам нужно развернуть массив comments, затем выполнить поиск для каждого комментария, чтобы получить прокомментированного пользователя.

db.post.aggregate([
  {
    $lookup: {
      from: "users",
      localField: "created_by",
      foreignField: "_id",
      as: "created_users"
    }
  },
  {
    $lookup: {
      from: "comments",
      let: {
        p_id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$post_id",
                "$$p_id"
              ]
            }
          }
        }
      ],
      as: "comments"
    }
  },
  {
    $unwind: "$comments"
  },
  {
    $lookup: {
      from: "users",
      localField: "comments.sender_id",
      foreignField: "_id",
      as: "commented_user"
    }
  },
  {
    $set: {
      "comments.commented_user": "$commented_user",
      
    }
  },
  {
    $unset: "commented_user"
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...