Как получить данные, используя агрегат с динамической коллекцией с массивом _id

мне нужно получить данные из динамической коллекции, например, если тип = категория, затем извлеките данные из коллекции категорий, если тип = баннер, извлеките данные из баннера.

Массив входных данных:

[
 {
  "title": "New Product",
  "row_data": [
   {
    "type": "category",
    "data": [
      5cf4edcdc70d4716d821d45d,5cf4ee36c70d4716d821d460
    ]
   },
   {
    "type": "banner",
    "data": [
     5ce4eb55b02bd01ca09eb909
    ]
   },
   {
    "type": "product",
    "data": [
     5cf4eed8c70d4716d821d465,5cf4fa09c70d4716d821d483
    ]
   }
  ],
  "_id": "5cf611c7fcc98b16b0e89200"
 }
]

Ожидаемый выходной массив:

[
 {
  "title": "New Product",
  "row_data": [
   {
    "type": "category",
    "data": [{_id: 5cf4edb7c70d4716d821d45c, image: "image.jpg", title: "Saree"},{_id: 5cf4edcdc70d4716d821d45d, image: "image.jpg", title: "Kurti"}]
   },
   {
    "type": "banner",
    "data": [{_id: 5ce4eb55b02bd01ca09eb909, name: "first banner", image: "banner-image.jpg"}]
   },
   {
    "type": "product",
    "data": [{_id: 5cf4eed8c70d4716d821d465, image: "image.jpg", sku: "S-01"},{_id: 5cf4fa09c70d4716d821d483, image: "image.jpg", sku: "K-01"}]
   }
  ],
  "_id": "5cf611c7fcc98b16b0e89200"
 }
]
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучшее, что вы можете сделать, это использовать $фасет, чтобы разделить его на несколько различных агрегаций, а затем «объединить» их обратно в требуемую структуру.

Это будет выглядеть примерно так:

{
   $unwind: "$row_data"
},   
{
  $facet: {
     categories: [{
         $lookup:{
           from: "categories",
           let: { ids: "$row_data.data"},
           pipeline: [
              { $match:
                 { $expr:
                    { 
                        $in: ["$_id", "$$ids"]
                    }
                 }
              },
           ],
           as: "match"
         }},
         {
           $match: {
              'match.0': {$exists: true}
           } 
         },
         {
            $addFields: {
                 temp: {type: 'category', data: '$match'}
            }
        }
     ],
     banners: [{
         $lookup:{
           from: "banner",
           let: { ids: "$row_data.data"},
           pipeline: [
              { $match:
                 { $expr:
                    { 
                        $in: ["$_id", "$$ids"]
                    }
                 }
              },
           ],
           as: "match"
         }},
         {
           $match: {
              'match.0': {$exists: true}
           } 
        },
        {
            $addFields: {
                 temp: {type: 'banner', data: '$match'}
            }
        }
     ],
     ....
  }
},
{
  $addFields: {
    "merged": { $concatArrays: [ "$categories", "$banners", ...] }
  }
},
{
 $unwind: "$merged"
},
{
  $group: {
     _id: "$merged._id",
     title: {$first: "$merged.title"},
     row_data: {$push: "$merged.temp"}
  }
}

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

Другие вопросы по теме