【问题标题】:How to $sum and $filter in Mongodb aggregate (Group)如何在 Mongodb 聚合(组)中进行 $sum 和 $filter
【发布时间】:2019-07-17 22:53:01
【问题描述】:

尝试将上述数据与组聚合相加总是返回 0。

{
     team: "5d091e8b402c1d089042000d"
     _id: "5d2e63ce89be227d171eb4a7"
     goals: [
      {
        player: "5d20636a4b0bf2670c1e014c"
        createdAt: "1970-01-01T00:18:31.111+00:00"
        value: 1
        _id: 5d2e63ce89be227d171eb4aa
      },
      {
        player: "5d20636a4b0bf2670c1e014c"
        createdAt: "1970-01-01T00:18:31.111+00:00"
        value: 1
        _id: 5d2e63ce89be227d171eb4aa
      }
     ]
    }

    {
     team: "5d091e8b402c1d089042000d"
     _id: "5d2e63ce89be227d171eb4a7"
     goals: [
      {
        player: "5d20636a4b0bf2670c1e014c"
        createdAt: "1970-01-01T00:18:31.111+00:00"
        value: 1
        _id: 5d2e63ce89be227d171eb4aa
      },
      {
        player: "5d20636a4b0bf2670c1e014c"
        createdAt: "1970-01-01T00:18:31.111+00:00"
        value: 1
        _id: 5d2e63ce89be227d171eb4aa
      }
     ]
    }

当前尝试:

{
  _id: "$team",
    total: { 
      "$sum": {
        "$filter": {
            "input": "$goals", 
            "as": "s",
            "cond": { "$eq": [ "$$s.player", "5d20636a4b0bf2670c1e014c"] }
        }  
      }
    }
}

以上返回:

{ _id: 5d20636a4b0bf2670c1e014c, total: 0}

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    将过滤作为单独的管道阶段移动,然后运行 ​​double $sum 会更容易(内部对单个文档中的数组求和,外部聚合跨文档值)

    db.collection.aggregate([
        {
            $addFields: {
                goals: {
                    $filter: {
                        input: "$goals",
                        as: "g",
                        cond: {
                            $eq: [ "$$g.player", "5d20636a4b0bf2670c1e014c" ]
                        }
                    }
                }
            }
        },
        {
            $group: {
                _id: "$team",
                total: { $sum: { $sum: "$goals.value" } }
            }
        }
    ])
    

    Mongo Playground

    【讨论】:

    • 嗨@mickl 在这种情况下 $$this 是什么意思?但是,上述建议的解决方案不会返回总数。
    • $$this 表示当前处理的元素,这是我测试的方法:mongoplayground.net/p/WEX8DiLDAAI
    • @micki 为了清楚起见,我已经更新了 MongoDB 播放的数据以及我的问题,并附上了一张图片。同时,它仍然无法在我的机器上运行,也让我知道你为什么使用 $project 而不是 Group。
    • @AlexOnozor 抱歉,我误解了你的问题,修改了我的答案
    猜你喜欢
    • 2023-02-19
    • 1970-01-01
    • 2023-01-13
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2019-09-29
    • 2019-05-19
    相关资源
    最近更新 更多