Добавление оставшихся файлов в $project после добавления поиска в мангусте

Я выполняю поиск $ по схеме _id в порядке, и она работает, как и ожидалось. А вот в $project как добавить остальные ключи. Я добавил свой код ниже.

Коллекция товаров:

{
"_id": "54759eb3c090d83494e2d804",
"product_name": "sample product",
"image": "default.png",
"price": 55,
"discount": 5,
}

Коллекция списка заказов

   {
        "user_name": "sample1",
        "product_list":[
        {
          "product_id": "54759eb3c090d83494e2d804"
          "quantity": 5
        }
        ]
    }

поиски

[
      {
        from: 'product',
        localField: 'product_list.product_id',
        foreignField: '_id',
        as: 'product_list.product_id',
        model: 'ProductModel',
      },
    ],

$Проект

{
      user_name: true,
      product_list: {
        $map: {
          input: '$product_list.product_id',
          as: 'product',
          in: {
            product_name: '$$product.product_name',
          },
        },
      },
    }

Текущий результат:

{
    "user_name": "sample1",
    "product_list":[
       "product_id":{
          "product_name": "sample product"
        }
     ]
}

В этом текущем результате поле количества отсутствует. Как добавить в $project?. Ожидаемый результат показан ниже

Ожидаемый результат:

   {
      "user_name": "sample1",
       "product_list":[
           {
               "product_id": {
                    "product_name": "sample product"
                }
               "quantity": 5
           }
         ]
   }

person Sudharsan Venkatraj    schedule 13.08.2020    source источник
comment
после поиска, что будет на выходе?   -  person varman    schedule 13.08.2020
comment
Вывод был похож на Текущий результат   -  person Sudharsan Venkatraj    schedule 13.08.2020
comment
опубликовать образец коллекции продуктов   -  person varman    schedule 13.08.2020
comment
@varman, я обновил коллекцию продуктов выше   -  person Sudharsan Venkatraj    schedule 13.08.2020
comment
Я проверяю это, а пока удалил свой ответ   -  person Gibbs    schedule 13.08.2020
comment
когда вы используете поиск, он даст вам массив продуктов. Означает ли это, что у вас только отношения один на один?   -  person varman    schedule 13.08.2020
comment
На самом деле я новичок в этих концепциях, тогда есть ли другой способ сделать это?   -  person Sudharsan Venkatraj    schedule 13.08.2020
comment
@SudharsanVenkatraj ниже отвечает на ваш вопрос? дайте мне знать, если у вас возникнут какие-либо проблемы.   -  person turivishal    schedule 26.08.2020


Ответы (1)


Вам нужно сделать $unwind перед $lookup, потому что это не будет работать напрямую в полях массива, и здесь вам не нужна $map внутри $project,

  • $unwind product_list деконструировать массив
db.order.aggregate([
  { $unwind: "$product_list" },
  • $поиск с конвейером, это позволит использовать конвейер внутри поиска, здесь $project к обязательным полям
  {
    $lookup: {
      from: "product",
      as: "product_list.product_id",
      let: { product_id: "$product_list.product_id" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$$product_id", "$_id"] }
          }
        },
        {
          $project: {
            _id: 0,
            product_name: 1
          }
        }
      ]
    }
  },
  • $unwind с путем product_list.product_id, потому что он нужен вам как объект
  { $unwind: { path: "$product_list.product_id" } },
  • $group путем _id перестроения массива product_list
  {
    $group: {
      _id: "$_id",
      user_name: { $first: "$user_name" },
      product_list: { $push: "$product_list" }
    }
  }
])

Игровая площадка

person turivishal    schedule 13.08.2020
comment
Вы меня поймали на минуту раньше :) - person Gibbs; 13.08.2020
comment
Упс, извините, ребята, только что сделал это и опубликовал. - person turivishal; 13.08.2020
comment
Никаких проблем @turivishal :) Продолжайте качать все - person Gibbs; 13.08.2020
comment
@turivishal ха-ха, это было круто - person varman; 13.08.2020
comment
Может быть, это неуважение к вам, я никогда не видел ваших комментариев с ОП, просто зайдите сюда, прочитайте вопрос и ответьте в течение 3 минут :( - person turivishal; 13.08.2020
comment
Нет, братан, то, что ты делаешь, совершенно нормально... Тебе не нужно никого ждать. Очевидно, я тоже учусь на ответах :D - person varman; 13.08.2020