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

MongoDBでネストされた配列内の値を検索・更新する方法

ネストされた配列の値を検索して変更するには?

MongoDBでは、ネストされた配列(ドキュメント配列)内の特定の値を検索して変更したい場合、updateコマンドと$elemMatch演算子、さらに位置演算子$を組み合わせることで実現できます。

この記事では、実際のコレクションを作成しながら、ネストされた配列内の値を更新する手順を具体的に解説します。

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

まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成します。ここでは、会社名と複数のプロジェクト情報(開発者詳細)を持つドキュメントを挿入します。

> db.findAndModifyAValueInNestedArrayDemo.insertOne({
    "CompanyName" : "Amazon",
    "DeveloperDetails" : [
        { "ProjectName" : "Online Book Store", "TeamSize" : "5" },
        { "ProjectName" : "Library Management System", "TeamSize" : "7" },
        { "ProjectName" : "Online Banking Application", "TeamSize" : "15" }
    ]
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ca275226304881c5ce84b9f")
}

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

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

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

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

{
    "_id" : ObjectId("5ca275226304881c5ce84b9f"),
    "CompanyName" : "Amazon",
    "DeveloperDetails" : [
        {
            "ProjectName" : "Online Book Store",
            "TeamSize" : "5"
        },
        {
            "ProjectName" : "Library Management System",
            "TeamSize" : "7"
        },
        {
            "ProjectName" : "Online Banking Application",
            "TeamSize" : "15"
        }
    ]
}

3. ネストされた配列内の値を更新する

ここからが本題です。ネストされた配列内の値を検索して変更するには、以下のクエリを使用します。

この例では、「Online Banking Application」というProjectNameに一致する要素を$elemMatchで検索し、そのTeamSizeを「20」に更新しています。ポイントは、位置演算子$を使って、条件に一致した配列要素のみを対象にすることです。

> db.findAndModifyAValueInNestedArrayDemo.update(
    { DeveloperDetails: { $elemMatch: { ProjectName: "Online Banking Application" } } },
    { $set: { 'DeveloperDetails.$.TeamSize': '20' } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

実行結果のWriteResultを見ると、nMatchedが1(一致したドキュメント数)、nModifiedが1(実際に更新されたドキュメント数)となっており、更新が成功したことがわかります。

4. 更新結果の確認

最後に、ドキュメントが正しく値「20」に更新されているかどうかを確認しましょう。

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

実行すると、次の出力が得られます。

{
    "_id" : ObjectId("5ca275226304881c5ce84b9f"),
    "CompanyName" : "Amazon",
    "DeveloperDetails" : [
        {
            "ProjectName" : "Online Book Store",
            "TeamSize" : "5"
        },
        {
            "ProjectName" : "Library Management System",
            "TeamSize" : "7"
        },
        {
            "ProjectName" : "Online Banking Application",
            "TeamSize" : "20"
        }
    ]
}

ご覧の通り、「Online Banking Application」のTeamSizeだけが「15」から「20」に変更され、他の要素は元のまま保たれています。

まとめ:ポイントのおさらい

  • $elemMatch演算子を使うことで、配列内のドキュメントに対する複雑な条件一致が可能になります。
  • 位置演算子$は、クエリ条件に最初に一致した配列要素を指し示します。これにより、意図した要素だけを正確に更新できます。
  • $setと組み合わせることで、ネストされた配列内の特定フィールドのみを効率的に変更できます。

この手法を覚えておけば、配列の中にさらにオブジェクトが格納されているような複雑なデータ構造でも、柔軟に更新操作を行えるようになります。

  1. 【PHP入門】foreachで配列の値にアクセス・変更して返す方法

    PHPのforeachループでは、変数の前に「&」(アンパサンド)を付けることで、配列の各要素への参照(リファレンス)を取得できます。これにより、ループ内で要素の値を直接操作したり、処理結果を別の配列として返したりすることが可能になります。 基本構文 foreachで配列の値にアクセスする際の基本構文は以下のとおりです。 foreach ($yourArrayName as &$anyVariableName) 「&」を付けると、ループ変数は値のコピーではなく元の配列要素への参照になります。そのため、ループ内での変更が元の配列にも反映されます。 サンプル配列の準備

  2. C#でジャグ配列(配列の配列)の長さとランクを取得する方法

    C#におけるジャグ配列(jagged array、配列の配列)は、それぞれの要素が異なる長さの配列を持つことができる柔軟なデータ構造です。この記事では、ジャグ配列の長さやランク(次元数)、境界値を取得する方法を解説します。ジャグ配列の宣言と初期化まず、次のようにジャグ配列を宣言して初期化します。int[][] arr = new int[][] { new int[] { 0, 0 }, new int[] { 1, 2 }, new int[] { 2, 4 }, new int[] { 3, 6 }, new int[] { 4, 8 } };この例