MongoDBのアグリゲートで配列の値のみを取得する方法
MongoDBでドキュメント内の配列から「値」だけを抽出したい場合、アグリゲーションパイプラインの $project ステージと $map 演算子を組み合わせることで実現できます。本記事では、具体的なサンプルコードとともにその手順をわかりやすく解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。以下では insertOne() メソッドを使用して、「Information」という配列フィールドを持つドキュメントを挿入しています。
> db.demo411.insertOne(
... {
... "Information" : [
... {
... "Name1" : "Chris",
... "Name2" : "David"
... },
... {
... "Name1" : "John",
... "Name2" : "John"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70f19715dc524f70227682")
}
登録済みドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo411.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e70f19715dc524f70227682"), "Information" : [ { "Name1" : "Chris", "Name2" : "David" }, { "Name1" : "John", "Name2" : "John" } ] }
配列の値のみを取得するアグリゲートクエリ
ここからが本題です。配列内の値(キーを除いたデータ本体)だけを取得するには、以下のように aggregate() メソッドを使用します。
> db.demo411.aggregate(
... [
... {$project : {
... _id : 0,
... Information : {$map : {input : "$Information", as : "out", in : ["$$out.Name1", "$$out.Name2"]}}
... }
... }
... ]
... )
実行結果は次のとおりです。
{ "Information" : [ [ "Chris", "David" ], [ "John", "John" ] ] }
クエリのポイント解説
- $project:出力に含めるフィールドを指定するステージです。
_id : 0とすることで、デフォルトで出力される_idフィールドを除外しています。 - $map:配列の各要素に対して処理を適用し、新しい配列を生成する演算子です。
inputに元の配列、asに各要素を参照するための変数名、inに変換後の式を指定します。 - $$out.Name1 / $$out.Name2:変数
outを通じて、各要素からName1とName2の値のみを取り出し、新しい配列として構築しています。
このように、$project と $map を組み合わせることで、ネストされた配列から必要な値だけを効率的に抽出できます。フィールド名や配列の構成は実際のデータに合わせて自由に変更できるので、ぜひご自身のプロジェクトでも活用してみてください。
-
MongoDBコレクションから一意の値(重複なし)を取得する方法【distinct()の使い方】
MongoDBでコレクション内の重複データを除外し、一意の値だけを取得したい場合は、distinct()メソッドを使用します。distinct()は、指定したフィールドに含まれる重複しない値を1つのコレクション全体から検索し、その結果を配列として返します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを挿入し、コレクションを作成します。> db.demo704.insertOne({"LanguageCode":"hi"}); { "acknowledged" : true, &quo
-
MongoDBでグループごとの最大値を取得する方法($sortと$groupの活用)
MongoDBで、重複している個別の要素(グループ)ごとに最大値を取得したい場合、aggregate()メソッドと$sort・$groupステージを組み合わせることで実現できます。この記事では、実際のコード例を通じて、その手順をわかりやすく解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここではdemo750というコレクションに、idとvalueフィールドを持つドキュメントを挿入します。> db.demo750.insertOne({id:101,value:50}); { acknowledged : true, inserted