10

コレクション名が Alpha_Num で、次の構造になっています。どのアルファベットと数字のペアが最大回数出現するかを調べようとしていますか?

以下のデータだけを使用すると、ペア abcd-123 はペア efgh-10001 のように 2 回表示されますが、2 番目のペアは同じドキュメントに表示されるため、有効なケースではありません。

{
    "_id" : 12345,
    "Alphabet" : "abcd",
        "Numerals" : [
            "123",
            "456",
            "2345"
        ]
}
{
    "_id" : 123456,
    "Alphabet" : "efgh",
    "Numerals" : [
            "10001",
            "10001",
            "1002"
        ]
}

{
    "_id" : 123456567,
    "Alphabet" : "abcd",
        "Numerals" : [
            "123"
        ]
}

以下のような集約フレームワークを使用しようとしました

db.Alpha_Num.aggregate([
                     {"$unwind":"$Numerals"},
                     {"$group":
                              {"_id":{"Alpha":"$Alphabet","Num":"$Numerals"},
                               "count":{$sum:1}}
                     },
                     {"$sort":{"count":-1}}
                     ])

このクエリの問題は、ペア efgh-10001 が 2 回与えられることです。質問: 上記の条件で、配列「数値」から個別の値を選択するにはどうすればよいですか?

4

1 に答える 1

23

問題が解決しました。

db.Alpha_Num.aggregate([{
     "$unwind": "$Numerals"
}, {
     "$group": {
             _id: {
                     "_id": "$_id",
                     "Alpha": "$Alphabet"
             },
             Num: {
                     $addToSet: "$Numerals"
             }
     }
}, {
     "$unwind": "$Num"
}, {
     "$group": {
             _id: {
                     "Alplha": "$_id.Alpha",
                     "Num": "$Num"
             },
             count: {
                     "$sum": 1
             }
     }
}])

$addToSet を使用してグループ化し、再び巻き戻すことでうまくいきました。10genのオンライン講座で回答を得ました。

于 2013-04-22T03:55:28.540 に答える