Как объединить результаты двух запросов?

Пример данных в бд:

Коллекция COMMON
{
  "_id": ObjectId("idCommon_1"),
  "idDirectory": ObjectId("idDirectory_1")
},
{
  "_id": ObjectId("idCommon_2"),
  "idDirectory": ObjectId("idDirectory_2")
},

Коллекция DIRECTORY
{
  "_id": ObjectId("idDirectory_1"),
  "documents":[
    {
    "_id": ObjectId("idDocument_1"),
    "comment": "Комментарий_1"
    },
    {
    "_id": ObjectId("idDocument_2"),
    "comment": "Комментарий_2"
    }
  ]
},
{
  "_id": ObjectId("idDirectory_2"),
  "documents":[
    {
    "_id": ObjectId("idDocument_3"),
    "comment": "Комментарий_3"
    }
  ]
}

Коллекция DOCUMENT
{
  "_id": ObjectId("idDocument_1"),
  "number": "num_1"
},
{
  "_id": ObjectId("idDocument_2"),
  "number": "num_2"
},
{
  "_id": ObjectId("idDocument_3"),
  "number": "num_3"
}

Нужно сделать запрос в COMMON и получить ожидаемый результат:

[
  {
    "id": "idCommon_1",
    "documentsResponse": [
      {
      "id": "idDocument_1",
      "number": "num_1",
      "comment": "Комментарий_1"
      },
      {
      "id": "idDocument_2",
      "number": "num_2",
      "comment": "Комментарий_2"
      }
    ]
  },
  {
    "id": "idCommon_2",
    "documentsResponse": [
      {
      "id": "idDocument_3",
      "number": "num_3",
      "comment": "Комментарий_3"
      }
    ]
  }
]

Сейчас делаю запрос, состоящий из двух lookup:

Aggregation aggregation = newAggregation(
  lookup1("DIRECTORY", "idDirectory", "_id", "directory"),
  lookup2("DOCUMENT", "directory.idDocument", "_id", "documentsResponse")
);
mongoTemplate.aggregate(aggregation, "COMMON", Object.class);

Но тогда получается два разных массива: directory(в котором хранятся необходимые мне directory.comment) и documentsResponse (где хранятся documentsResponse.number). Не понимаю как это объединить с учетом idDocument. А если меняю lookup2 на

lookup2("DOCUMENT", "directory.idDocument", "_id", "directory.document")

то directory.comment затираются.


Ответы (1 шт):

Автор решения: Alexander Petrov
db.DIRECTORY.aggregate([
  {
    "$project": { "a": "$documents" }
  },
  {
    "$lookup": {
      "from": "DOCUMENT",
      "localField": "a._id",
      "foreignField": "_id",
      "as": "b"
    }
  },
  {
    "$project": {
      "x": {
        "$map": {
          "input": "$a",
          "as": "c",
          "in": {
            "$mergeObjects": [
              "$$c",
              { "$arrayElemAt": [ "$b", 0 ] }
            ]
          }
        }
      }
    }
  },
  {
    "$lookup": {
      "from": "COMMON",
      "localField": "_id",
      "foreignField": "idDirectory",
      "as": "d"
    }
  },
  { "$unwind": "$d" },
  {
    "$project": {
      "_id": "$d._id",
      "documentsResponse": "$x"
    }
  }
])

https://mongoplayground.net/p/5sQxK2EEya1

→ Ссылка