mongodb $ project产生一个数组值数组

时间:2017-03-06 22:24:40

标签: mongodb aggregation-framework

我有一个订单表和一个表格表。表单有很多订单,我使用以下命令运行成功的$ lookup:

{
    from: 'orders',
    localField: 'slug',
    foreignField: 'form_slug',
    as: 'orders'
}
然后我尝试像这样投射:

{quantities : "$orders.line_items.quantity"}

问题是我得到一个嵌套数组的数组(见下面的结果),当我真的只需要总和时。

是否可以在嵌套数组中以某种方式$ sum这些值?

"quantities": [
    [
        NumberLong(1)
    ],
    [
        NumberLong(1),
        NumberLong(1)
    ],
    [
        NumberLong(1)
    ],
    [
        NumberLong(1)
    ],
    [
        NumberLong(1)
    ],
    [
        NumberLong(1),
        NumberLong(1),
        NumberLong(1)
    ],
    [
        NumberLong(1)
    ],
    [
        NumberLong(1)
    ]
]

2 个答案:

答案 0 :(得分:1)

您可以尝试对Mongo 3.4版本

进行汇总

以下查询使用$reduce$concatArrays缩小为与另一个$reduce链接的值数组,以计算总数。

{
 $project: {
        total: {
            $reduce: {
                input: {
                    $reduce: {
                        input: "$orders.line_items.quantity",
                        initialValue: [],
                        in: {
                            $concatArrays: ["$$value", "$$this"]
                        }
                    }
                },
                initialValue: 0,
                in: {
                    $add: ["$$value", "$$this"]
                }
            }
        }
    }
}

Mongo 3.2及更低。在$lookup

之后添加以下阶段
{$unwind:"$orders"},
{$unwind:"$orders.line_items"},
{$unwind:"$orders.line_items.quantity"},
{$group:{"_id":null, total:{"$sum":"$orders.line_items.quantity"}}}

答案 1 :(得分:1)

spring.datasource.url=jdbc:postgresql://localhost:5432/track-courier spring.datasource.username=postgres spring.datasource.password=postgres spring.jpa.hibernate.ddl-auto=update


    {
        "$lookup": {
            "from": "orders",
            "localField": "slug",
            "foreignField": "form_slug",
            "as": "orders"
        }
    }, {
        "$unwind": "$orders"
    }, {
        "$unwind": "$orders.line_items.quantities"
    }, {
        "$unwind": "$orders.line_items.quantities"
    }, {
        "$group": {
            "_id": "$_id",
            "sum": {
                "$sum": "$orders.line_items.quantities"
            }
        }
    }