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

#node.js #mongodb #mongoose #data-structures #aggregate

Вопрос:

Я борюсь с тем, как объединить два объекта после поиска в конвейере агрегации.

Структура проектной документации:

 {
  _id: "609daa4a831d2cfee5a54c7e",
  projectName: "Test",
  items: [
    {
      "show": true,
      "_id": "609daa4e831d2cfee5a54c7f",
      "order": 0,
      "item": "609da844b9c98ffeb5b42c0f",
      "createdAt": "2021-05-13T22:38:06.264Z",
      "uid": "607d6f08734bdb0fdd8f9837",
      "updatedAt": "2021-05-13T22:38:06.264Z"
    },
    {
      "show": true,
      "order": 1,
      "_id": "609daa4e831d2cfee5a54c7e",
      "item": "609daaa4831d2cfee5a54c81",
      "createdAt": "2021-05-13T22:38:06.264Z",
      "uid": "607d6f08734bdb0fdd8f9837",
      "updatedAt": "2021-05-13T22:38:06.264Z"
    },
    ....
  ]

}
 

После агрегирования я хотел бы сначала выполнить поиск$, чтобы получить фактический элемент, на который ссылается project.items[].item, а затем поместить исходные данные в project.items[] в новый ключевой project.items[].ProjectData, как это:

 const afterAggregation = {
  id: "609daa4a831d2cfee5a54c7e",
  projectName: "Test",
  items: [
    {
      "id": "609e6a82eca2c80a8d3bad8a",
      "originalName": "z_paymentCancelled_9.wav",
      ....
      "projectData": {
        "show": true,
        "createdAt": "2021-05-13T22:38:06.264Z",
        "uid": "607d6f08734bdb0fdd8f9837",
        "updatedAt": "2021-05-13T22:38:06.264Z"
      }
    },
    {
      "id": "609e6a82eca2c80a8d3bad8a",
      "originalName": "z_paymentCancelled_9.wav",
      ....
      "projectData": {
        "show": true,
        "createdAt": "2021-05-13T22:38:06.264Z",
        "uid": "607d6f08734bdb0fdd8f9837",
        "updatedAt": "2021-05-13T22:38:06.264Z"
      }
    },
  ]
}
 

Вот как я выполняю первый поиск, который работает нормально:

 "$lookup": {
        "from": "items",
        "let": { "itemIds": "$items.item" },
        "pipeline": [
            { "$match": { "$expr": { "$in": ["$_id", "$itemIds"] } } },
            {
                $addFields: {
                    id: { $toString: "$_id" },
                },
            },
            {
                $project: { '_id': 0, 'wav2json': 0 },
            },
        ],
        "as": "items"
    }
 

Но не понимаете, как добавить исходные данные в элементы[].ProjectData??

В качестве бонуса я хотел бы дополнительно иметь возможность сортировать агрегированные элементы по project.items[].order…

Любая помощь глубоко признательна!

Комментарии:

1. Сделал игровую площадку с неправильным ответом, если это поможет mongoplayground.net/p/Rp0wDph0ZNi