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

MongoDb—通过聚合值子集的乘积来查询集合,mongodb,Mongodb,假设我有一个收藏: [ { _id: product_a, values: [ { id: 1, value: 0 }, { id: 2, value: 1 }, { id: 3, value: 2 }, ] }, { _id: product_b, values: [ { id: 1, value

假设我有一个收藏:

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

下面是如何使用2.2聚合框架实现模式的方法。注意,如果id/值对以id作为键存储,则这将简单得多

您的聚合:

请注意,如果文档的结构是:
{u id:“product_x”,值:[{id1:value},{id2:value}等]}

现在使用以下命令从shell运行查询:
>db.collection.aggregate(管道)


或者通过
db.runCommand({“聚合”:“集合”,“管道”:[…])从代码中调用。

您的模式是固定的还是可以将值存储为{“id1”:“值”,“id2”:“值”…}?i、 你的id值是预先知道的吗?谢谢Asya,看起来棒极了!我想我必须使用Mongo的开发发行版才能拥有这个功能,对吗?
[
    {
        "$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"
                ]
            }
        }
    }
]