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

MongoDBでドキュメントからサブドキュメントを削除する方法($pull演算子の使い方)

MongoDBでは、ドキュメント内に埋め込まれたサブドキュメント(ネストされたドキュメント)を削除したいケースがよくあります。そのような場合に便利なのが、$pull 演算子です。$pull は update() メソッドと組み合わせて使用することで、配列から条件に一致する要素を取り除くことができます。

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

まず、ドキュメントを含むコレクションを作成してみましょう。

> db.demo538.insertOne(
... {
...     id:101,
...     "details":
...     {
...        anotherDetails:
...        [
...           {
...              "Name":"Chris",
...              Age:21
...           },
...           {
...              "Name":"David",
...              Age:23
...           },
...           {
...              "Name":"Bob",
...              Age:20
...           }
...        ]
...     }
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8c8f0aef4dcbee04fbbc08")
}

登録済みドキュメントの確認

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

> db.demo538.find();

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

{ "_id" : ObjectId("5e8c8f0aef4dcbee04fbbc08"), "id" : 101, "details" : { "anotherDetails" : [
    { "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 23 }, { "Name" : "Bob", "Age" : 20 } ]
} }

「details.anotherDetails」配列の中に、3つのサブドキュメント(Chris、David、Bob)が格納されていることが確認できます。

$pull を使ったサブドキュメントの削除

ここで、年齢(Age)が23のサブドキュメントを削除してみましょう。以下のように、$pull 演算子を指定した update() クエリを実行します。

> db.demo538.update({ id:101},
... {$pull : { "details.anotherDetails" : {"Age":23} } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

実行結果を見ると、「nModified」が1となっており、1件のドキュメントが正常に更新されたことがわかります。

削除後のドキュメントの確認

再度 find() メソッドを実行して、更新後の状態を確認します。

> db.demo538.find();

出力結果は以下の通りです。

{ "_id" : ObjectId("5e8c8f0aef4dcbee04fbbc08"), "id" : 101, "details" : { "anotherDetails" : [ {
"Name" : "Chris", "Age" : 21 }, { "Name" : "Bob", "Age" : 20 } ] } }

「Age: 23」を持つ David のサブドキュメントが配列から削除され、Chris と Bob の2件だけが残っていることが確認できます。

ポイントまとめ

  • $pull:指定した条件に一致する要素を配列からすべて削除する演算子です。
  • パスの指定:「details.anotherDetails」のように、ドット記法でネストされた配列の位置を指定します。
  • 条件指定:{ "Age": 23 } のように、削除したいサブドキュメントのフィールドと値を一致条件として渡します。
  • なお、新しいバージョンのMongoDBでは、update() の代わりに updateOne()updateMany() の使用が推奨されています。

このように、$pull 演算子を使えば、ネストされた配列内の特定のサブドキュメントを簡単かつ確実に削除することができます。

  1. MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順

    MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i

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

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