Рассчитать общую стоимость из поиска с помощью mongodb

#node.js #mongodb #e-commerce

#node.js #mongodb #электронная коммерция

Вопрос:

У меня есть корзина покупок, я пытаюсь подсчитать общую стоимость, но все, что я пытаюсь, похоже, не работает:

Пример коллекции корзины:

 {
    "hash": "xxxxx",
    "items": [
        {
            productCode: 'xxx',
            qty: 4
        }
    ]
}
  

Пример коллекции продуктов:

 {
   [
       {
           productCode: 'xxx',
           price: 299
       }
   ]
}
  

Мой текущий код:

 const basket = await this.collection.aggregate([
    { $match: { hash } }, // Find the shopping cart with the hash
    { $lookup: { from: 'products', localField: 'items.productCode', foreignField: 'productCode', as: 'products' } },
    { $limit: 1 },
    { $project: {
            _id: false,
            qtys: '$items',
            products: '$products'
            // totalCost // Output the total cost of all the products
        }
    }
]).toArray();
  

Мне нужно рассчитать цену, умножив ее на кол-во в данных товаров … есть идеи, что делать?

Спасибо

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

1. Пример документов MongoDB для $multiply , похоже, именно то, что вы пытаетесь сделать: docs.mongodb.com/manual/reference/operator/aggregation/multiply /…

Ответ №1:

Вы можете добиться этого несколькими различными способами, я считаю, что проще всего сделать это в $unwind поле товара корзины, выполнить расчет, а затем восстановить структуру следующим образом:

 db.basket.aggregate([
  { $match: { hash } },
  {
    $limit: 1 // why do we need this? isn't the hash unique?
  },
  {
    $unwind: "$items"
  },
  {
    $lookup: {
      from: "products",
      localField: "items.productCode",
      foreignField: "productCode",
      as: "products"
    }
  },
  {
    $unwind: "$products"
  },
  {
    $group: {
      _id: "$_id",
      items: {
        $push: "$items"
      },
      products: {
        $push: "$products"
      },
      totalCost: {
        $sum: {
          "$multiply": [
            "$products.price",
            "$items.qty"
          ]
        }
      }
    }
  },
  {
    $project: {
      _id: false,
      
    }
  }
])
  

MongoPlayground