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 ...
];

「値」のサブセットの積を集計して、このコレクションをクエリする方法はありますか?

{ 値: [ 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/値のペアが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. ]}

次に、シェルからクエリを実行します。 > db.collection.aggregate(pipeline)

またはあなたのコードからdb.runCommand({"aggregate":"collection","pipeline":[...]})

于 2012-07-29T20:02:29.743 に答える