1

假设我有一个集合:

[
    {
        _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 ...
];
4

1 回答 1

2

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

您的聚合管道

[
    {
        "$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":[...]})

于 2012-07-29T20:02:29.743 回答