Mongodb 由于子数组展开后重复,Mongo父和错误

Mongodb 由于子数组展开后重复,Mongo父和错误,mongodb,Mongodb,在我的Mongo模式中有两个和需要计算。一个在父数组中,另一个在子数组中。当我展开子数组时,我会得到重复的对象,这使得父数组和太大 以下是模式: orders = [{ orderDate: new Date(), amt: 1000, shipments: [{ shippedAmt: 200 }, { shippedAmt: 300 }] }, { orderDate: new D

在我的Mongo模式中有两个和需要计算。一个在父数组中,另一个在子数组中。当我展开子数组时,我会得到重复的对象,这使得父数组和太大

以下是模式:

orders = [{ 
          orderDate: new Date(), 
          amt: 1000, 
          shipments: [{ shippedAmt: 200 }, { shippedAmt: 300 }]
     }, 
     {  
          orderDate: new Date(), 
          amt: 5000, 
          shipments: [{ shippedAmt: 1000 }, { shippedAmt: 2000 }]
     }
]
我只需要知道如何进行项目、分组、放松和再次项目,以获得amt total的月度分组,以及shippedAmt total的月度分组。

以下是您的查询:

db.orders.aggregate({
  $group: {
    _id: "$orderDate",
    amtTotalOut: {
      $sum: "$amt"
    },
    shipments: {
      $push: "$shipments"
    }
  }
}, {
  $unwind: {
    path: "$shipments", preserveNullAndEmptyArray: true
  }
}, {
  $unwind: {
    path: "$shipments", preserveNullAndEmptyArray: true
  }
}, {
  $group: {
    _id: "$_id",
    amtTotalOut: {
      $first: "$amtTotalOut"
    },
    totalShippedAmt: {
      $sum: "$shipments.shippedAmt"
    }
  }
}).pretty()
说明:

首先,我用
orderDate
进行分组,并使用
$sum
中的
$group stage
累加器计算
金额的总和

这样,我们得到的_id等于
orderDate
,它将解决
amt
字段的重复条目,并消除由于重复条目而导致的
amt
的巨额金额

在这个阶段中,我还推动了
装运
以形成装运数组,保留装运字段的所有值,但它将$group stage的装运输出为array INDER和array

因此,我在
装运上使用了两次$REWIND

然后在最后的
$group阶段
我再次使用
$sum
计算
shippedAmt
的和

更新:

在查询中,我已经在$group阶段使用了
orderDate
,您可以使用
$month和$year操作符来按月份和年份分组

{$group: {
    _id: {
       month: { $month: "$orderDate"},
       year: { $year: "$orderDate"}
    }
}}
以下是您的疑问:

db.orders.aggregate({
  $group: {
    _id: "$orderDate",
    amtTotalOut: {
      $sum: "$amt"
    },
    shipments: {
      $push: "$shipments"
    }
  }
}, {
  $unwind: {
    path: "$shipments", preserveNullAndEmptyArray: true
  }
}, {
  $unwind: {
    path: "$shipments", preserveNullAndEmptyArray: true
  }
}, {
  $group: {
    _id: "$_id",
    amtTotalOut: {
      $first: "$amtTotalOut"
    },
    totalShippedAmt: {
      $sum: "$shipments.shippedAmt"
    }
  }
}).pretty()
说明:

首先,我用
orderDate
进行分组,并使用
$sum
中的
$group stage
累加器计算
金额的总和

这样,我们得到的_id等于
orderDate
,它将解决
amt
字段的重复条目,并消除由于重复条目而导致的
amt
的巨额金额

在这个阶段中,我还推动了
装运
以形成装运数组,保留装运字段的所有值,但它将$group stage的装运输出为array INDER和array

因此,我在
装运上使用了两次$REWIND

然后在最后的
$group阶段
我再次使用
$sum
计算
shippedAmt
的和

更新:

在查询中,我已经在$group阶段使用了
orderDate
,您可以使用
$month和$year操作符来按月份和年份分组

{$group: {
    _id: {
       month: { $month: "$orderDate"},
       year: { $year: "$orderDate"}
    }
}}

好的,不需要放松,也不需要消耗她这么多的资源。 您可以在单个小组阶段中执行此操作:

db.collection.aggregate([
  {
    $group: {
      _id: {
        year: {
          $year: "$orderDate",
        },
        month: {
          $month: "$orderDate",
        }
      },
      totalAmt: {
        $sum: "$amt"
      },
      totalShipments: {
        $sum: {
          $reduce: {
            input: "$shipments",
            initialValue: 0,
            in: {
              $add: [
                "$$value",
                "$$this.shippedAmt"
              ]
            }
          }
        }
      }
    }
  }
])
说明:按年度和月份分组、金额总和和减少装运总额数组(减少本身计算每个文档的装运总额)


你可以试试看

好的,不需要放松,也不需要消耗太多资源。 您可以在单个小组阶段中执行此操作:

db.collection.aggregate([
  {
    $group: {
      _id: {
        year: {
          $year: "$orderDate",
        },
        month: {
          $month: "$orderDate",
        }
      },
      totalAmt: {
        $sum: "$amt"
      },
      totalShipments: {
        $sum: {
          $reduce: {
            input: "$shipments",
            initialValue: 0,
            in: {
              $add: [
                "$$value",
                "$$this.shippedAmt"
              ]
            }
          }
        }
      }
    }
  }
])
说明:按年度和月份分组、金额总和和减少装运总额数组(减少本身计算每个文档的装运总额)


您可以尝试它

您希望最终ans按照该日期的
orderedDate
amt
的总和以及该日期的
shippedAmt
的总和进行分组?您希望最终ans按照该日期的
orderedDate
amt
的总和进行分组,那一天的总出货量是多少?真的吗?问题是,这一部分在查询中不存在(实际上应该存在),但我不认为这是这里的主要问题,使用$month操作符可以轻松完成按月订单(或搜索文档/博客),我的查询确实解决了重复条目的主要问题,并给出了正确答案。不过,我会更新我的答案。@matthPen但我更喜欢你的方法…:-)真正地问题是,这一部分在查询中不存在(实际上应该存在),但我不认为这是这里的主要问题,使用$month操作符可以轻松完成按月订单(或搜索文档/博客),我的查询确实解决了重复条目的主要问题,并给出了正确答案。不过,我会更新我的答案。@matthPen但我更喜欢你的方法…:-)谢谢matthPen,你的答案很清楚,效果很好。谢谢matthPen,你的答案很清楚,效果很好。