Mongodb 由于子数组展开后重复,Mongo父和错误
在我的Mongo模式中有两个和需要计算。一个在父数组中,另一个在子数组中。当我展开子数组时,我会得到重复的对象,这使得父数组和太大 以下是模式:Mongodb 由于子数组展开后重复,Mongo父和错误,mongodb,Mongodb,在我的Mongo模式中有两个和需要计算。一个在父数组中,另一个在子数组中。当我展开子数组时,我会得到重复的对象,这使得父数组和太大 以下是模式: orders = [{ orderDate: new Date(), amt: 1000, shipments: [{ shippedAmt: 200 }, { shippedAmt: 300 }] }, { orderDate: new D
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,你的答案很清楚,效果很好。