Агрегировать с процентами группы от общего поля и поля поиска - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь использовать 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 и агрегатном конвейере.Возможно ли то, что я пытаюсь сделать?Если так, что мне нужно изменить в моем подходе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...