Mongodb $与Subarray列表项值相加

时间:2016-07-21 20:39:04

标签: json node.js mongodb mongodb-query

我正在尝试计算订单中实际位于子数组中的产品总数。

在尝试计算时遇到$ 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
}

请为我的问题找到最佳解决方案。

2 个答案:

答案 0 :(得分:2)

你的agreggation是正确的,问题是qty字段是一个字符串。尝试将其更改为“数量”:3。这应该工作

答案 1 :(得分:0)

您只能使用数值计算$sumhttps://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)
            }
        });

    });
})

然后执行您的聚合