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

MongoDBで既存のレコードを削除しながら更新する方法:$pull演算子の使い方

MongoDBの$pull演算子とは

MongoDBでは、既存のドキュメントから配列内の特定の要素を削除しながら更新を行う場合、$pull演算子を使用します。$pullは、指定した条件に一致する配列要素をすべて取り除くことができる便利な更新演算子です。

この記事では、実際にコレクションを作成し、$pull演算子を使って既存のレコードを削除・更新する手順を解説します。

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

まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。ここでは「removeDemo」というコレクションに、ユーザー情報を持つ2件のドキュメントを挿入します。

> db.removeDemo.insertOne(
...     {
...        "UserName" : "Larry",
...        "UserDetails" : [
...           {
...              "_id" : 101,
...              "UserEmailId" : "976Larry@gmail.com"
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc7f9f88f9e6ff3eb0ce446")
}
> db.removeDemo.insertOne(
...     {
...        "UserName" : "Mike",
...        "UserDetails" : [
...           {
...              "_id" : 102,
...              "UserEmailId" : "Mike121@gmail.com"
...           }
...        ]
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc7f9f98f9e6ff3eb0ce447")
}

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

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

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

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

{
    "_id" : ObjectId("5cc7f9f88f9e6ff3eb0ce446"),
    "UserName" : "Larry",
    "UserDetails" : [
       {
          "_id" : 101,
          "UserEmailId" : "976Larry@gmail.com"
       }
    ]
}
{
    "_id" : ObjectId("5cc7f9f98f9e6ff3eb0ce447"),
    "UserName" : "Mike",
    "UserDetails" : [
       {
          "_id" : 102,
          "UserEmailId" : "Mike121@gmail.com"
       }
    ]
}

3. $pull演算子でレコードを削除・更新する

それでは、$pullクエリを実装して、既存のレコードを削除しながら更新してみましょう。ここでは、「_id」が「5cc7f9f98f9e6ff3eb0ce447」であるMikeのドキュメントから、「_id: 102」のUserDetails配列要素を取り除きます。

> db.removeDemo.update(
...     {"_id": ObjectId("5cc7f9f98f9e6ff3eb0ce447")},
...     { "$pull": { "UserDetails": {"_id": 102}}}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

実行結果の「nModified : 1」は、1件のドキュメントが正常に更新されたことを示しています。

4. 削除結果の確認

最後に、再度find()メソッドでドキュメントを表示し、オブジェクトが正しく削除されたかどうかを確認します。

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

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

{
    "_id" : ObjectId("5cc7f9f88f9e6ff3eb0ce446"),
    "UserName" : "Larry",
    "UserDetails" : [
       {
          "_id" : 101,
          "UserEmailId" : "976Larry@gmail.com"
       }
    ]
}
{
    "_id" : ObjectId("5cc7f9f98f9e6ff3eb0ce447"),
    "UserName" : "Mike",
    "UserDetails" : [ ]
}

まとめ

$pull演算子を使うことで、ドキュメント自体を削除することなく、配列フィールド内の特定の要素だけを取り除いて更新できます。上記の例では、Mikeのドキュメントは残ったまま、UserDetails配列の中身だけが空になっていることが確認できます。

なお、MongoDBの新しいバージョンでは、update()の代わりにupdateOne()やupdateMany()メソッドの使用が推奨されているため、実際の開発ではこちらを利用するとよいでしょう。

  1. MySQLで最後のレコードを選択して更新する方法

    MySQLでテーブルの最後のレコードを選択して更新するには、ORDER BY DESCとLIMITを組み合わせて使用します。この記事では、実際の手順を順を追って解説します。1. テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Name varchar(100) -> );Query OK, 0 rows affected (0.59 sec)2. レコードの挿入i

  2. MySQLで列を更新し、末尾のアンダースコア(_)を削除する方法

    MySQLで文字列の末尾にある特定の値(この場合はアンダースコア「_」)を削除したい場合、TRIM()関数を使用します。以下にUPDATE文の基本構文を示します。update yourTableName set yourColumnName=trim(trailing _ from yourColumnName);サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1521 -> ( -> StudentCode varchar(20) -> ); Query OK, 0 r