Агрегирование по массиву и деление количества на длину массива - PullRequest
0 голосов
/ 03 мая 2020

Теперь я хочу объединить схему для группировки по пользователям в массиве и разделить поле элементов по длине массива, чтобы создать среднее значение.
Это просто json data ->

[{"users": ["5ea40086fc4b145b489da93d","5e8cb9a4462e45178c4d3405"],"isBuilt": true, "_id": "5eadd43b30f97f342cf663fc", "items": 3, ...},
{"users": ["5e8cb9a4462e45178c4d3405"], "isBuilt": true, "_id": "5ead419081eec52258b67f70", "items": 5, ...}]

И после агрегирование с ->

Building.aggregate([
    {
      $match: {
        updatedAt: {
          $gte: startDate,
          $lte: endDate
        },
        isBuilt: true
      }
    },
    {
      $unwind: "$users"
    },
    {
      $group: {
        _id: "$users",
        items: {
          $sum: '$items'
        }
      }
    },
    {
      $project: {
        user: '$_id',
        items: 1,
        _id: 0
      }
    }
  ])

Я получил это json ->

[{"items": 3, "user": "5ea40086fc4b145b489da93d"}, {"items": 8, "user": "5e8cb9a4462e45178c4d3405"}]

Как вы видите здесь, я получил сумму предметов . В исходных данных Users "5ea40086fc4b145b489da93d" and "5e8cb9a4462e45178c4d3405" имеет 3 элемента, а user "5e8cb9a4462e45178c4d3405" - 5 элементов. И после агрегирования они подсчитывают по сумме элементов, что user "5e8cb9a4462e45178c4d3405" -> 8 items, and user "5ea40086fc4b145b489da93d" -> 3 items ... Теперь я хочу сделать средние элементы для пользователей, например, если длина массива пользователей равна 2 или более, он разделит элементы и даст сумму .. и окончательный json будет выглядеть как ->

[{"items": 1.5, "user": "5ea40086fc4b145b489da93d"}, {"items": 6.5, "user": "5e8cb9a4462e45178c4d3405"}]

PS, если результат элемента не целочисленный, результат должен быть округлен до десяти

1 Ответ

0 голосов
/ 03 мая 2020

Я решил мою проблему с агрегацией ->

Building.aggregate([
    {
      $match: {
        updatedAt: {
          $gte: startDate,
          $lte: endDate
        },
        isBuilt: true
      }
    },
    {
      $addFields: {
        itemsAvg: {
          $divide: ["$items", {$size: "$users"}]
        }
      }
    },
    {
      $addFields: {
        roundedItemsAvg: {
          $round: ["$itemsAvg", 1]
        }
      }
    },
    {
      $unwind: "$users"
    },
    {
      $group: {
        _id: "$users",
        items: {
          $sum: '$roundedItemsAvg'
        }
      }
    },
    {
      $project: {
        user: '$_id',
        items: 1,
        _id: 0
      }
    }
  ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...