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

MongoDBコレクションから配列を取得する方法【aggregateフレームワーク活用】

MongoDBでネストされたドキュメント内の配列データを取得したい場合、アグリゲーション(集計)フレームワークを使用するのが効果的です。この記事では、実際にコレクションを作成しながら、$unwindと$groupを使って配列から値を取り出す手順を解説します。

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

まず、insertOne()メソッドを使って、ネストされた配列構造を持つドキュメントを含むコレクションを作成しましょう。

> db.getArrayDemo.insertOne(
    {
       "CustomerId":101,
       "CustomerDetails":[
          {
             "CustomerName":"Larry",
             "CustomerFriendDetails":[
                {
                   "CustomerFriendName":"Sam"
                },
                {
                   "CustomerFriendName":"Robert"
                }
             ]
          },
          {
             "CustomerName":"Chris",
             "CustomerFriendDetails":[
                {
                   "CustomerFriendName":"David"
                },
                {
                   "CustomerFriendName":"Carol"
                }
             ]
          }
       ]
    }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda4949b50a6c6dd317adb7")
}

2. find()メソッドで全ドキュメントを確認

作成したコレクションの内容を、find()メソッドで表示して確認してみます。

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

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

{
   "_id" : ObjectId("5cda4949b50a6c6dd317adb7"),
   "CustomerId" : 101,
   "CustomerDetails" : [
      {
         "CustomerName" : "Larry",
         "CustomerFriendDetails" : [
            {
               "CustomerFriendName" : "Sam"
            },
            {
               "CustomerFriendName" : "Robert"
            }
         ]
      },
      {
         "CustomerName" : "Chris",
         "CustomerFriendDetails" : [
            {
               "CustomerFriendName" : "David"
            },
            {
               "CustomerFriendName" : "Carol"
            }
         ]
      }
   ]
}

3. aggregateフレームワークで配列を取得する

それでは本題です。MongoDBコレクションから配列の値を取得するには、以下のようなクエリを使用します。ポイントは$unwindでネストされた配列を展開し、$group$pushで値をまとめるところです。

> db.getArrayDemo.aggregate([
    { "$unwind": "$CustomerDetails" },
    { "$unwind": "$CustomerDetails.CustomerFriendDetails"},
    {
       "$group": {
          "_id": null,
          "CustomerFriendDetails": { "$push": "$CustomerDetails.CustomerFriendDetails.CustomerFriendName" }
       }
    }
]);

クエリの仕組み

  • $unwind:配列フィールドを分解し、各要素ごとに個別のドキュメントとして扱えるようにします。ここでは「CustomerDetails」と、その中の「CustomerFriendDetails」の2段階にわたって展開しています。
  • $group:「_id: null」を指定することで、すべてのドキュメントを1つのグループにまとめます。
  • $push:グループ化した結果として、「CustomerFriendName」の値を1つの配列に蓄積していきます。

このクエリを実行すると、次のような出力が得られます。

{ "_id" : null, "CustomerFriendDetails" : [ "Sam", "Robert", "David", "Carol" ] }

このように、ネストされた配列の中から必要な値だけを抽出し、フラットな配列として取得することができました。$unwindと$groupを組み合わせるテクニックは、MongoDBで階層構造のデータを扱う際に非常に役立つので、ぜひ覚えておきましょう。

  1. MongoDBでコレクションから配列フィールド全体を削除するクエリの書き方

    MongoDBで配列フィールドを完全に削除するにはMongoDBのコレクションから、ドキュメント内の配列フィールドそのもの(フィールドごと)を取り除きたい場合は、更新演算子の $unset を使用します。$unset は指定したフィールドをドキュメントから削除する演算子で、配列の中身だけを空にするのではなく、フィールド自体が存在しない状態にできます。ここでは、サンプルコレクションを作成して、実際に配列フィールドを削除する手順を見ていきましょう。1. サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを挿入し、テスト用のコレクション demo609 を作成します

  2. MongoDBコレクションから重複を削除する方法|unique制約の使い方を解説

    MongoDBコレクションから重複を削除する方法MongoDBのコレクションに重複データが登録されるのを防ぎたい場合は、ユニーク制約(unique: true)を設定するのが最も基本的かつ確実な方法です。対象フィールドにユニークインデックスを作成しておくことで、同じ値を持つドキュメントの挿入が自動的に拒否され、コレクション内に重複が存在しない状態を維持できます。基本構文以下のように、コレクション名とフィールド名を指定してユニークインデックスを作成します。「dropDups: true」を付けることで、インデックス作成時点で既に存在していた重複ドキュメントも削除され、各グループの最初の1件のみが