我正在尝试计算订单中实际位于子数组中的产品总数。
在尝试计算时遇到$ sum的问题。
我的尝试
db.getCollection('orders').aggregate([
{$match:{'order_no':'GHT19'}},
{$unwind:"$products_list"}
])
我的结果
{
"_id" : ObjectId("57838a3a3628f76b52511ffe"),
"order_no" : "GHT19",
"origin_port" : "Vizag Port",
"destination_port" : "Hankou Port"
"products_list" : {
"box_no" : "1",
"product_name" : "Mobile",
"qty" : "5"
}
}
{
"_id" : ObjectId("57838a3a3628f76b52511ffe"),
"order_no" : "GHT19",
"origin_port" : "Vizag Port",
"destination_port" : "Hankou Port"
"products_list" : {
"box_no" : "2",
"product_name" : "Television",
"qty" : "2"
}
}
{
"_id" : ObjectId("57838a3a3628f76b52511ffe"),
"order_no" : "GHT19",
"origin_port" : "Vizag Port",
"destination_port" : "Hankou Port",
"products_list" : {
"box_no" : "3",
"product_name" : "Radio",
"qty" : "2"
}
}
尝试按照以下方式进行SUM
db.getCollection('orders').aggregate([
{$match:{'order_no':'GHT19'}},
{$unwind:"$products_list"},
{$group: {
_id: '$products_list.box_no',
"total_products": {$sum: "$products_list.qty" }
}
}
])
我得到ZERO结果。请参阅以下结果。
{
"_id" : "2",
"total_products" : 0
}
{
"_id" : "3",
"total_products" : 0
}
{
"_id" : "1",
"total_products" : 0
}
请为我的问题找到最佳解决方案。
答案 0 :(得分:2)
你的agreggation是正确的,问题是qty字段是一个字符串。尝试将其更改为“数量”:3。这应该工作
答案 1 :(得分:0)
您只能使用数值计算$sum
:https://docs.mongodb.com/manual/reference/operator/aggregation/sum/
您可以将所有products_list.qty
转换为数字:
db.device.find().forEach(function(data) {
data.products_list.forEach(function(data2) {
db.device.update({
"_id": data._id,
"products_list.box_no": data2.box_no
}, {
"$set": {
"products_list.$.qty": parseInt(data2.qty)
}
});
});
})
然后执行您的聚合