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 の値を調整するだけで対応できます。
-
MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)
MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId
-
C#の2次元配列から要素にアクセスする方法を徹底解説
2次元配列は、x個の行とy個の列を持つ「表(テーブル)」としてイメージすると理解しやすくなります。2次元配列の要素へアクセスするには、添字(インデックス)を使用します。具体的には、配列の行インデックスと列インデックスを指定します。int x = a[1,1]; Console.WriteLine(x);C#では、カンマで区切って a[行, 列] の形式で記述することにより、任意の位置にある要素を取得できます。上記の例では、1行1列の位置にある要素を変数 x に代入し、コンソールに出力しています。サンプルコード以下の例では、5行2列の2次元配列を作成し、入れ子になったforループですべての要素を