Добавление оставшихся файлов в $ project после добавления запросов в mongoose

#mon&odb #mon&oose #mon&odb-query #mon&oose-schema

#mon&odb #mon&oose #mon&odb-запрос #mon&oose-schema

Вопрос:

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

Коллекция продуктов:

 {
"_id": "54759eb3c090d83494e2d804",
"product_name": "sample product",
"ima&e": "default.pn&",
"price": 55,
"discount": 5,
}
  

Сбор списка заказов

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

запросы

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

$Project

 {
      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
           }
         ]
   }
  

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

1. каким будет результат после поиска?

2. Вывод был похож на текущий результат

3. опубликуйте некоторый образец коллекции продуктов

4. @varman, я обновил коллекцию продуктов выше

5. Я проверяю это, до тех пор пока не удалил свой ответ

Ответ №1:

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

  • $unwind product_list деконструирует массив
 db.order.a&&re&ate([
  { $unwind: "$product_list" },
  
  • $lookup с конвейером, это позволит использовать конвейер внутри поиска, здесь $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 с path product_list.product_id потому что он нужен вам как объект
   { $unwind: { path: "$product_list.product_id" } },
  
  • $&roup путем _id переконструирования вашего product_list массива
   {
    $&roup: {
      _id: "$_id",
      user_name: { $first: "$user_name" },
      product_list: { $push: "$product_list" }
    }
  }
])
  

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

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

1. Вы поняли меня за минуту до этого 🙂

2. Opps извините, ребята, просто сделал это и публикую.

3. Никаких проблем @turivishal 🙂 Продолжайте качать все

4. @turivishal хаха, это было потрясающе

5. Нет, братан, то, что ты делаешь, совершенно нормально…. Вам не нужно никого ждать. Очевидно, я тоже учусь на ответах: D