【问题标题】:Combine two mongo aggregate query results into one将两个mongo聚合查询结果合二为一
【发布时间】:2021-07-21 13:29:41
【问题描述】:

我有两个输出结果的 mongo 聚合管道。现在我想将这两个管道组合起来得到一个单一的输出。

请在下面找到样本集。

[
  {
    _id: "ddfdfdfdggfgfgsg",
    rate: "3323",
    quantity_packs: "343",
    shop_name: "Whole Foods",
    sku: "20"
    manufacturer_name: "Unilever"
  },
  {
    _id: "ddfdfdfsdsds",
    rate: "434",
    quantity_packs: "453",
    shop_name: "Carrefour",
    sku: "200"
    manufacturer_name: "Unilever"
  },
  {
    _id: "dfdfdgcvgfgfvvv",
    rate: "343",
    quantity_packs: "23",
    shop_name: "Target",
    manufacturer_name: "Beirsdorf"
    sku: "34"
  }
]

请在下面找到我的查询。

第一次查询

db.collection.aggregate([
    {
        $match: {
            manufacturer_name: {
                $in: [ "unilever" ]
            }
        }
    }, 

    {
        $group: {
            _id: {
                "Shop Name": "$shop_name"
            },

            "total_sku": {
                "$addToSet": "$sku"
            },

            "annual_cost": {
                $sum: {
                    $cond: [
                        {
                            $eq: ["$manufacturer_name", "unilever"]
                        },
                        {
                            "$toDouble": "$rate"
                        }, 
                        0
                    ]
                }
            },

            "annual_qty": {
                $sum: {
                    "$toDouble": "$annual_qty"
                }
            }
        }
    },

    {
        $project: {
            "sku count": {
                "$size": "$total_sku"
            },

            "Annual Cost WO GST": {
                $multiply: [ "$annual_cost", "$annual_qty" ]
            },
        }
    },
])

第一次查询的结果

[
  {
    _id: { 'Hospital Name': '7AM mart' },
    'sku count': 29,
    'Annual Cost WO GST': 79968887.67999999
  },
  {
    _id: { 'Shop Name': 'Apex' },
    'sku count': 20,
    'Annual Cost WO GST': 1779192666.96
  }
]

第二次查询

db.collection.aggregate([
    {
        $match: {
            $expr: {
                $ne: ["$manufacturer_name", "unilever"]
            }
        }
    }, 

    {
        $group: {
            _id: {
                "Shop Name": "$shop_name"
            },
            
            "annual_cost_wo_gst_wo_manu": {
                $sum: {
                    "$toDouble": "$rate"
                }
            },

            "annual_qty": {
                $sum: {
                    "$toDouble": "$annual_qty"
                }
            }
        }
    },

    {
        $project: {
            "Ann Cost For Other Manufacturers": {
                $multiply: ["$annual_cost_wo_gst_wo_manu", "$annual_qty"]
            },
        }
    }
])

第二次查询的结果

[
  {
    _id: { 'Hospital Name': 'Apex' },
    'Ann Cost For Other Manufacturers': 25246715130525.273
  },
  {
    _id: { 'Hospital Name': '7AM Mart' },
    'Ann Cost For Other Manufacturers': 1347701834351.495
  }
]

如上所述,我想通过正确映射项目来组合结果。

预期结果

[
      {
        _id: { 'Hospital Name': '7AM mart' },
        'sku count': 29,
        'Annual Cost WO GST': 79968887.67999999
        'Ann Cost For Other Manufacturers': 1347701834351.495
      },
      {
        _id: { 'Shop Name': 'Apex' },
        'sku count': 20,
        'Annual Cost WO GST': 1779192666.96
        'Ann Cost For Other Manufacturers': 25246715130525.273
      }
    ]

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您的 2 个查询并没有完全产生您所说的输出。不过,您可以首先执行不相关的$lookup 来执行您的第二个查询,将您的辅助查询的结果存储在一个字段/对象中。然后您可以继续您的第一个查询。最后从之前存储的字段/对象中提取二次查询的结果。

    这是一个Mongo playground,对您的原始示例进行了一些修改以供您参考。

    【讨论】:

    • 您好……sku 计数和年度成本显示为零值。
    • 这是因为从您给定的数据集中,未提供字段 sku。您可能需要再次更新您提供的示例数据集。
    • 糟糕...在集合数据集中添加了 SKU 键。对不起:)
    • 操场链接已更新 =] 我要强调的是将您的辅助查询放入 $lookup 子管道的想法。其他领域的预测应该相对容易理解。
    • 您好,谢谢您的回答。 sku 计数为 1 而不是显示数量,并且两种年度成本都显示相同的值。
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多