MongoDBで配列の要素数をカウントし、新しいフィールドに表示する方法
ドキュメント内の配列要素の数をカウントするには、MongoDBの $size 演算子を使用します。$size は集計パイプライン(aggregate)の中で利用でき、指定した配列フィールドに含まれる要素の総数を数値として返します。
ここでは、実際にコレクションを作成しながら、配列要素数をカウントして新しいフィールドに表示する手順を解説します。
1. コレクションの作成
まず、ドキュメントを挿入してコレクションを作成します。各ドキュメントには科目名を格納する配列フィールド「ListOfSubject」を持たせます。
> db.demo703.insertOne({"ListOfSubject":["MySQL","MongoDB"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ebaf551299a9f98c93b4")
}
> db.demo703.insertOne({"ListOfSubject":["Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ebb5551299a9f98c93b5")
}
> db.demo703.insertOne({"ListOfSubject":["C","C++","Python"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6ebbf551299a9f98c93b6")
}2. 登録されたドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo703.find();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5ea6ebaf551299a9f98c93b4"), "ListOfSubject" : [ "MySQL", "MongoDB" ] }
{ "_id" : ObjectId("5ea6ebb5551299a9f98c93b5"), "ListOfSubject" : [ "Java" ] }
{ "_id" : ObjectId("5ea6ebbf551299a9f98c93b6"), "ListOfSubject" : [ "C", "C++", "Python" ] }それぞれのドキュメントには、2件・1件・3件の科目が配列として格納されていることがわかります。
3. 配列要素数をカウントするクエリ
続いて、$project ステージと $size 演算子を組み合わせた集計クエリを実行し、各配列の要素数を新しいフィールド「NumberOfItemsInEachArray」として出力します。
> db.demo703.aggregate({$project:{NumberOfItemsInEachArray:{$size:"$ListOfSubject"}}}).pretty();実行結果は以下の通りです。
{
"_id" : ObjectId("5ea6ebaf551299a9f98c93b4"),
"NumberOfItemsInEachArray" : 2
}
{
"_id" : ObjectId("5ea6ebb5551299a9f98c93b5"),
"NumberOfItemsInEachArray" : 1
}
{
"_id" : ObjectId("5ea6ebbf551299a9f98c93b6"),
"NumberOfItemsInEachArray" : 3
}ポイントまとめ
$sizeは配列フィールド専用の演算子であり、引数には配列型のフィールドを指定する必要があります。$projectステージ内で使用することで、元のドキュメントに存在しない新しいフィールドとしてカウント結果を出力できます。- 既存フィールドも残したい場合は、
$project内でListOfSubject: 1のように明示的に指定してください。
このように、$size を活用すれば、配列の長さに応じたデータ分析や条件絞り込み($match との組み合わせなど)も簡単に行えます。
-
【MongoDB】$addFieldsで新しいフィールドを追加し、価格を特定の数値で割った結果を連結する方法
MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。本記事では、ネストされた配列内の商品価格(ProductPrice)を特定の数値で割り、その結果を文字列として連結して新しいフィールドに格納する方法を、サンプルコードとともに解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ドキュメントを含むコレクションを作成します。 > db.demo719.insertOne( ... { ... Number:7374644, ... de
-
MySQLで名前ごとにグループ化し、カウント結果を新しい列に表示する方法
MySQLでは、GROUP BY句とCOUNT()関数を組み合わせることで、同じ値を持つレコードをまとめて集計できます。この記事では、名前の列をグループ化し、各名前の出現回数を新しい列として表示するクエリの書き方を、具体的な手順とともに解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成しましょう。 mysql> create table DemoTable ( Name varchar(30) ); Query OK, 0 rows affected (0.63 sec) レコードの挿入 次に、INSERTコマンドを使って複数のレコードを挿入します。ここでは、