【问题标题】:Aggregate group by array and divide quantity to array length按数组聚合组并将数量除以数组长度
【发布时间】:2020-08-17 17:29:21
【问题描述】:

现在我想聚合模式以按数组中的用户分组,并将项目字段划分为数组长度以创建平均值..
这是简单的 json 数据 ->

[{"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如果item的结果不是整数,结果应该四舍五入到十

【问题讨论】:

    标签: arrays node.js mongoose group-by aggregation


    【解决方案1】:

    我已经解决了我的聚合问题 ->

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 2013-01-12
      • 2014-08-19
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多