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

MongoDBでサブドキュメントを操作する方法:ドット記法と位置演算子$の活用

MongoDBにおいて、配列内のサブドキュメント(埋め込みドキュメント)を操作するには、ドット(.)記法を使用します。本記事では、実際のコード例を通して、配列内の特定のサブドキュメントを更新する手順を詳しく解説します。

1. コレクションの作成とデータの挿入

まず、insertOne()メソッドを使って、サブドキュメントを含むドキュメントを持つコレクションを作成します。以下の例では、「details」というフィールドに複数のオブジェクトが格納された配列を含むドキュメントを挿入しています。

> db.demo378.insertOne(
...    {
...       Name: 'Chris',
...       details:[
...          {id:101,Score:56},
...          {id:102,Score:78}
...       ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e5a758a2ae06a1609a00b0f")
}

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

find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。

> db.demo378.find();

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

{
    "_id" : ObjectId("5e5a758a2ae06a1609a00b0f"), "Name" : "Chris", "details" : [
       { "id" : 101, "Score" : 56 }, { "id" : 102, "Score" : 78 }
    ]
}

3. サブドキュメントの更新クエリ

次に、サブドキュメントを操作するクエリを見てみましょう。ここでは、ドット(.)記法で「details.id」を条件として指定し、位置演算子($)を使って、条件に一致した配列要素のみを対象に更新を行っています。

具体的には、idが102である要素の「Score」フィールドに対し、$inc演算子を使って-8(つまり8を減算)しています。

> db.demo378.update({Name: "Chris", "details.id":102 }, { $inc: { "details.$.Score": -8 } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

出力結果の「nMatched: 1」「nModified: 1」から、1件のドキュメントが条件に一致し、正常に更新されたことがわかります。

ポイント解説

  • 「details.id:102」: ドット(.)記法により、配列内のサブドキュメントのフィールドを検索条件として指定できます。
  • 「details.$.Score」: 位置演算子($)は、クエリ条件に一致した最初の配列要素を自動的に識別し、その要素だけを更新します。
  • $inc演算子: 数値フィールドを指定した値だけ増減させることができます。

4. 更新後のドキュメント確認

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

> db.demo378.find();

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

{
    "_id" : ObjectId("5e5a758a2ae06a1609a00b0f"), "Name" : "Chris", "details" : [
       { "id" : 101, "Score" : 56 }, { "id" : 102, "Score" : 70 }
    ] 
}

ご覧のとおり、idが102のサブドキュメントの「Score」が78から70に更新されました。一方、idが101の要素は影響を受けていません。

まとめ

MongoDBでネストされたサブドキュメントや配列内の要素を操作する際は、ドット(.)記法と位置演算子($)を組み合わせることで、目的の要素だけをピンポイントで効率的に更新できます。この手法は、配列内の一部のデータだけを変更したい場合に非常に便利です。

  1. MongoDBクエリでサブドキュメント(埋め込みドキュメント)にアクセスする方法

    MongoDBでサブドキュメント(埋め込みドキュメント)にアクセスするには、find()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記では、「親フィールド名.子フィールド名」の形式でネストされたフィールドを指定できます。1. コレクションとドキュメントの作成まず、サブドキュメントを含むドキュメントを持つコレクションを作成しましょう。 db.demo670.insertOne({ id:102, details: { Name:David, Age:22, CountryName:UK, SubjectName:MySQL } } ); { ackno

  2. MongoDBでサブドキュメントを配列に追加し続ける方法($push演算子の使い方)

    MongoDBで既存のドキュメント内にある配列にサブドキュメントを追加し続けたい場合は、$push 演算子を使用します。ドキュメントを更新する際には update() メソッドと組み合わせて使います。本記事では、実際のコード例を通じて具体的な手順を解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使ってコレクションを作成し、ドキュメントを挿入します。> db.demo587.insertOne({id:101,details:[{Name:Chris,Age:21,Marks:57}]}); { acknowledged : true,