Как привлечь 10 лучших клиентов с наибольшим оборотом?

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Я хотел бы вывести 10 лучших клиентов с наибольшим оборотом.

Итак, у меня есть коллекция заказов с этим примером ввода документа:

 {
  _id: ObjectId()
  products: Array
  getCartTotalPrice: 100
  owner: ObjectId()
  createdAt: 2020-10-21T14:24:17.918 00:00
  updatedAt: 2020-10-21T14:24:17.918 00:00
  __v: 0
}
 

У меня уже есть решение, где я могу вывести общий оборот от одного конкретного клиента. Вот пример:

 //Get total turnover from this client
router.get('/admin/turnover/client/:userID', async (req, res) => {
  const userID = req.params.userID
  const mongoose = require("mongoose");
  let turnoverClient = await Order.aggregate([
    {
      $match: {"owner": new mongoose.Types.ObjectId(userID)}
    },
    {
      $group: {
        _id: '',
        "totalTurnover": { $sum: '$getCartTotalPrice'}
      }
    }
  ]).exec();

  const turnover = turnoverClient[0] || 0;

  if (turnover == 0) {
    const data = 0
    res.json(data)
  } else {
    const data = turnoverClient[0].totalTurnover.toLocaleString('de')
    res.json(data)
  }
});
 

Ответ №1:

  • $group по owner , получаем сумму getCartTotalPrice
  • $sort в totalTurnover порядке убывания
  • $limit 10 документов
 let Top10Clients = await Order.aggregate([
  {
    $group: {
      _id: "$owner",
      totalTurnover: { $sum: "$getCartTotalPrice" }
    }
  },
  { $sort: { totalTurnover: -1 } },
  { $limit: 10 }
]);
 

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