2

私はmongodbにサンプルドキュメントを持っています(そして私はまだmongodbに不慣れです)

{
    "ID": 0,
    "Facet1":"Value1",
    "Facet2":[
        {
            "Facet2Obj1":{
                "Obj1Facet1":"Value11",
                "Obj2Facet1":"Value21",
                "Obj3Facet1":"Value31"
            }   
        },
        {
            "Facet2Obj2":{
                "Obj1Facet2":"Value12",
                "Obj2Facet2":"Value22",
                "Obj3Facet2":"Value32"
            }
        },
        {
            "Facet2Obj3":{
                "Obj1Facet3":"Value13",
                "Obj2Facet3":"Value23",
                "Obj3Facet3":"Value33"
            }
        }
    ],
    "Facet3":"Value3"
    "Facet4":{
        "Facet4Obj1":{
            "Obj1Facet1":"Value4111"
        }
    }
}

Mapreduceは少し複雑で、次の出力を提供します(30,000ドキュメントの場合)。

{
    "_id" : "Facet1",
    "value" : [
        {
            "value" : "Value1",
            "count" : 30000,
            "ID" : [
                0,
                1,
            .
                .
                .
            ]
        }
    ]
}
{
    "_id" : "ID",
    "value" : [
        {
            "value" : 0,
            "count" : 1,
            "ID" : [
                0
            ]
        },
        {
            "value" : 1,
            "count" : 1,
            "ID" : [
                1
            ]
        },
        .
        .
        .
    ]
}
{
    "_id" : "Facet2",
    "value" : [
        {
            "value" : "Facet2Obj1",
            "count" : 30000,
            "ID" : [
                0,
                1,
                .
                .
                .
            ]
        },
        {
            "value" : "Facet2Obj2",
            "count" : 30000,
            "ID" : [
                0,
                1,
                .
                .
                .
            ]
        },
        {
            "value" : "Facet2Obj3",
            "count" : 30000,
            "ID" : [
                0,
                1,
                .
                .
                .
            ]
        }
    ]
}
{
    "_id" : "Facet3",
    "value" : [
    {
            "value" : "Value3",
        "count" : 30000,
            "ID" : [
                0,
                1,
                2,
                .
                .
                .
            ]
        }
    ]
} 
{
    "_id" : "Facet4",
    "value" : [
        {
            "value" : "Facet4Obj1",
            "count" : 30000,
            "ID" : [
                0,
                1,
                2,
                .
                .
                .
            ]
        }
    ]
}

このフォーマット(異なるID)を使用して30,000のドキュメントをmongodbに挿入し、次にmap-reduceを実行しましたが、時間がかかりました。30,000ドキュメントの場合は約30分かかりますが、ファセットを使用してインデックスを作成すると、350秒かかるように少し速くなりましたが、50,000ドキュメントの場合は再び約30分かかりました。db.collection.getIndexes()mongodbを使用してインデックスをチェックすると、次の出力が返されます。

{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "database.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "ID" : 1,
        "Facet1" : 1,
        "Facet2" : 1,
        "Facet3" : 1,
        "Facet4" : 1
    },
    "ns" : "database.collection",
    "name" : "ID_1_Facet1_1_Facet2_1_Facet3_1_Facet4_1"
}

インデックスを戦略的に配置する必要があるため、map-reduceがまだ十分に高速ではないという、インデックスで間違ったことはありますか。そうしないと、パフォーマンスの出力が逆になります。

回答は大歓迎です、そして事前に感謝します

4

1 に答える 1

5

MapReduceは、コレクション内のすべてのドキュメントをmap関数に渡します。ただし、MapReduceに送信されたドキュメントを「事前に」フィルタリングするために使用する{query:}オプションを渡す場合を除きます。{sort:}オプションをmapReduceに渡すこともできます。これにより、そのフィールドでソートされたマップ関数にドキュメントが送信されます。

インデックスが使用されるのはこれだけです。その後、作業のために生成されたJavascriptスレッドですべてが発生します。

于 2013-03-01T11:56:31.557 に答える