#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 }
]);