MongoDb - 通过聚合值子集的乘积来查询集合

时间:2012-07-29 17:53:35

标签: mongodb

假设我有一个收藏品:

[
    {
        _id: product_a,
        values: [
            { id: 1, value: 0 },
            { id: 2, value: 1 },
            { id: 3, value: 2 },
        ]
    },
    {
        _id: product_b,
        values: [
            { id: 1, value: 1 },
            { id: 2, value: 2 },
            { id: 3, value: 2 },
        ]
    },
    // etc ...
];

有没有办法通过聚合“值”子集的乘积来查询此集合?

如果我查询{values:[1,3]},我会得到类似的结果:

[
    {
        _id: product_a,
        result: 0 // since 0 * 2 = 0
    },
    {
        _id: product_b,
        result: 2 // since 1 * 2 = 2
    },
    // etc ...
];

1 个答案:

答案 0 :(得分:2)

以下是使用2.2聚合框架的方式,如何使用模式。请注意,如果id / value对以id作为键存储,则会更加简单。

您的汇总pipeline

[
    {
        "$unwind" : "$values"
    },
    {
        "$match" : {
            "values.id" : {
                "$in" : [
                    1,
                    3
                ]
            }
        }
    },
    {
        "$project" : {
            "_id" : 1,
            "val1" : {
                "$cond" : [
                    {
                        "$eq" : [
                            "$values.id",
                            1
                        ]
                    },
                    "$values.value",
                    -1
                ]
            },
            "val3" : {
                "$cond" : [
                    {
                        "$eq" : [
                            "$values.id",
                            3
                        ]
                    },
                    "$values.value",
                    -1
                ]
            }
        }
    },
    {
        "$group" : {
            "_id" : "$_id",
            "val1" : {
                "$max" : "$val1"
            },
            "val3" : {
                "$max" : "$val3"
            }
        }
    },
    {
        "$project" : {
            "_id" : 1,
            "result" : {
                "$multiply" : [
                    "$val1",
                    "$val3"
                ]
            }
        }
    }
]

请注意,如果文档的结构是: {_id: "product_x", values: [ {id1: value}, {id2: value} etc. ]}

现在从shell运行查询: > db.collection.aggregate(pipeline)

或通过db.runCommand({"aggregate":"collection","pipeline":[...]})

从您的代码中获取