Я пытаюсь использовать Mongoose, чтобы сгруппировать документы в коллекции Mongo по определенному полю и вернуть как значение поиска из этого поля, так и процент от общей коллекции, которую представляют документы этого типа.
Учитывая следующие коллекции:
Заказы
{
"_id" : ObjectId("5acdee5b80a4d21726f4fbaa"),
"date" : ISODate("2018-04-11T11:15:40.104Z"),
"orderType" : ObjectId("5a6cf47415621604942386aa")
},
{
"_id" : ObjectId("5acdee5b80a4d21726f4fcbb"),
"date" : ISODate("2018-04-12T17:43:11.317Z"),
"orderType" : ObjectId("5a6cf47415621604942386aa")
},
{
"_id" : ObjectId("5aba3a931cef621bd3b74ed7"),
"date" : ISODate("2018-04-16T12:22:18.117Z"),
"orderType" : ObjectId("5a6cf47415621604942386aa")
},
{
"_id" : ObjectId("5acdee5b80a4d21726f4fb70"),
"date" : ISODate("2018-04-19T08:13:01.223Z"),
"orderType" : ObjectId("5a6cf47415621604942386bb")
}
OrderType
{
"_id" : ObjectId("5a6cf47415621604942386aa"),
"name" : "Order Type 1"
},
{
"_id" : ObjectId("5a6cf47415621604942386bb"),
"name" : "Order Type 2"
}
Я хотел бы, чтобы полученные данные быливыглядит примерно так:
{
"orderType" : "Order Type 1",
"numOrders" : 3,
"percent" : 75
},
{
"orderType" : "Order Type 2",
"numOrders" : 1,
"percent" : 25
}
Мой код выглядит следующим образом:
//retrieve the total number of documents in the collection
let total = 0;
await models.orders.count({}).exec((err, cnt) => {
total = cnt.valueOf();
});
await models.orders.aggregate(
[
{
$group: {
_id: "$orderType",
ordersCount: { $sum: 1 }
}
},
{
$lookup: {
from: "OrderType",
localField: "orderType",
foreignField: "_id",
as: "orderType" }
},
{
$project: {
type: "$orderType.name",
orderCount: "$totalCount",
percent: { $multiply: [{$divide: [100, total]}, "$totalCount"]}
}
}
],(err, orders) => {
orders.map(order => {
//order.type is undefined here
console.log("order type: " + order.type);
console.log("order count: " + order.orderCount);
console.log("order %: " + order.percent);
})
});
Мне удалось использовать ответ, указанный в Получить проценты с агрегатом MongoDB $ group чтобы заставить работать orderCount и процентные вычисления, но поле типа в моей проекции возвращается как неопределенное.
Я довольно новичок в Mongoose и агрегатном конвейере.Возможно ли то, что я пытаюсь сделать?Если так, что мне нужно изменить в моем подходе?