1

この形式で約 500 のレコードがあります。

{
     "_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ),
     "device" : "SomeString",
     "carrier" : "Cell C(ZA)"
}

私が探しているのは、個別の通信事業者のリスト、通信事業者ごとのデバイス数、およびデバイスごとのデバイス数です。

これが私がこれまでに試したことです:

db.records.aggregate(
    { $project : {
       carrier : 1,
       device : 1,
    } },
    { $group : {
        _id : { carrier : "$carrier" },
        numDevice : {$sum:1},
        devices : { $addToSet : "$device"}
     } },
     { $sort: { numDevice: 1 }
});

出力は次のとおりです。

{ "result" : [
            {
                    "_id" : {
                            "carrier" : "Saudi Telecom Company (SA)"
                    },
                    "numDevice" : 229,
                    "devices" : [
                            "SomeString1",
                            "SomeString2
                    ]
            },
            {
                    "_id" : {
                            "carrier" : "AT&FU (US)"
                    },
                    "numDevice" : 392,
                    "devices" : [
                            "SomeString1",
                            "SomeString2",
                            "SomeString3"
                    ]
            }

], "ok" : 1 }

これは私が必要とするものに非常に近いものですが、理想的には、各「デバイス」セクションが次のようになることを望みます。

            {
                    "_id" : {
                            "carrier" : "AT&FU (US)"
                    },
                    "numDevice" : 315,
                    "devices" : [
                        {"SomeString1", 83},
                        {"SomeString2", 17},
                        {"SomeString5", 215},
                    ]
            }

devices 配列にはオブジェクトがあり、各オブジェクトには文字列カウントがあることに注意してください。上記の例では、デバイスSomeString183「AT&FU (US)」のコレクションに「occurrences」を持っていますcarrier

現在、carrier'AT&FU (US)' に 392 個の "SomeStringX" が関連付けられていることがわかりました。

集約パイプラインへのサブコールでこれを行うことは可能ですか、それとも map reduce を使用する必要がありますか? map reduce を行う必要がある場合、どうすればよいですか?

4

1 に答える 1