MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで配列要素の出現回数を集計して上位カウントを取得する方法

MongoDBで配列内の各要素が何回出現しているかを集計し、上位の要素だけを抽出したいケースはよくあります。そんなときはアグリゲーションフレームワーク(aggregate)を使うのが最も効率的です。この記事では、$unwind$group$sort$limit を組み合わせて、配列要素のトップカウントを取得する手順を具体的なサンプルコード付きで解説します。

1. サンプルコレクションの作成

まずは、学生IDと受講科目(配列)を持つドキュメントを格納するコレクションを作成します。insertOne() メソッドを使って、3件のドキュメントを挿入してみましょう。

> db.topCountArrayDemo.insertOne(
...     {"StudentId":101 , "StudentSubject": ["C", "MongoDB"]}
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc6b3209cb58ca2b005e669")
}
> db.topCountArrayDemo.insertOne(
...     {"StudentId":102 , "StudentSubject": ["C", "Java"]}
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc6b3219cb58ca2b005e66a")
}
> db.topCountArrayDemo.insertOne(
...     {"StudentId":103 , "StudentSubject": ["C", "MongoDB"]}
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc6b3229cb58ca2b005e66b")
}

2. 挿入したドキュメントの確認

find() メソッドを使えば、コレクション内のすべてのドキュメントを確認できます。

> db.topCountArrayDemo.find().pretty();

上記のクエリを実行すると、以下のような出力が得られます。

{
    "_id" : ObjectId("5cc6b3209cb58ca2b005e669"),
    "StudentId" : 101,
    "StudentSubject" : [
        "C",
        "MongoDB"
    ]
}
{
    "_id" : ObjectId("5cc6b3219cb58ca2b005e66a"),
    "StudentId" : 102,
    "StudentSubject" : [
        "C",
        "Java"
    ]
}
{
    "_id" : ObjectId("5cc6b3229cb58ca2b005e66b"),
    "StudentId" : 103,
    "StudentSubject" : [
        "C",
        "MongoDB"
    ]
}

3. アグリゲーションで配列要素のトップカウントを取得する

それでは本題です。配列要素ごとの出現回数を数え、上位の要素を抽出するには、次の4つのステージからなるパイプラインを構築します。

  • $unwind: 配列フィールド StudentSubject を展開し、要素ごとに個別のドキュメントを作成する
  • $group: 要素ごとにグループ化し、$sum: 1 で出現回数(Frequency)をカウントする
  • $sort: カウントの降順に並べ替える
  • $limit: 上位2件のみを取得する
> db.topCountArrayDemo.aggregate(
...     [
...         {
...             $unwind: "$StudentSubject"
...         },
...         {
...             $group: {
...                 _id: "$StudentSubject",
...                 Frequency: {$sum: 1}
...             }
...         },
...         {
...             $sort: {Frequency:-1}
...         },
...         {
...             $limit: 2
...         }
...     ]
... ).pretty();

4. 実行結果

上記のパイプラインを実行すると、以下のような結果が得られます。

{ "_id" : "C", "Frequency" : 3 }
{ "_id" : "MongoDB", "Frequency" : 2 }

この結果から、「C」が3回(全ドキュメントに出現)、「MongoDB」が2回出現していることがわかります。このように $unwind で配列を展開し、$group で集計する組み合わせは、タグの人気ランキングやアクセスログの集計など、さまざまな場面で応用できる強力なテクニックです。取得したい件数を変更したい場合は、$limit の値を調整するだけで対応できます。

  1. MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)

    MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId

  2. C#の2次元配列から要素にアクセスする方法を徹底解説

    2次元配列は、x個の行とy個の列を持つ「表(テーブル)」としてイメージすると理解しやすくなります。2次元配列の要素へアクセスするには、添字(インデックス)を使用します。具体的には、配列の行インデックスと列インデックスを指定します。int x = a[1,1]; Console.WriteLine(x);C#では、カンマで区切って a[行, 列] の形式で記述することにより、任意の位置にある要素を取得できます。上記の例では、1行1列の位置にある要素を変数 x に代入し、コンソールに出力しています。サンプルコード以下の例では、5行2列の2次元配列を作成し、入れ子になったforループですべての要素を