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

MongoDBで特定のフィールド(レコード)を検索して削除する方法

MongoDBでドキュメント内の特定のフィールドを検索するには $exists 演算子を使用し、そのフィールドを削除するには $unset 演算子を使用します。$unset は、指定したフィールドをドキュメントから取り除くための演算子です。

この記事では、実際にコレクションを作成し、Name フィールドを持つドキュメントからそのフィールドを一括削除する手順を解説します。

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

まず、ドキュメントを含むコレクションを作成しましょう。ここでは demo562 というコレクションに3件のドキュメントを挿入します。

> db.demo562.insertOne({"Name":"Chris","Age":21});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8f4ae854b4472ed3e8e872")
}
> db.demo562.insertOne({"Age":20});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8f4ae954b4472ed3e8e873")
}
> db.demo562.insertOne({"Name":"David","Age":23});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8f4aea54b4472ed3e8e874")
}

2件目のドキュメントには Name フィールドが存在しない点に注目してください。この違いが後ほど重要になります。

2. ドキュメントの確認

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

> db.demo562.find();

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

{ "_id" : ObjectId("5e8f4ae854b4472ed3e8e872"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e8f4ae954b4472ed3e8e873"), "Age" : 20 }
{ "_id" : ObjectId("5e8f4aea54b4472ed3e8e874"), "Name" : "David", "Age" : 23 }

Name フィールドを持つのは「Chris」と「David」の2件だけであることが確認できます。

3. フィールドの検索と削除

続いて、$exists で Name フィールドが存在するレコードを検索し、$unset でそのフィールドを削除します。{multi:true} オプションを指定することで、条件に一致するすべてのドキュメントに対して処理が適用されます。

> db.demo562.update( {Name:{$exists:true} },{ $unset: {"Name":""}},{multi:true});
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

出力結果を見ると、nMatched: 2(2件が一致)、nModified: 2(2件が更新)となっており、Name フィールドを持つ2件のドキュメントから正常にフィールドが削除されたことがわかります。

補足: MongoDB 4.2以降では update() は非推奨となっています。同様の処理を行う場合は updateMany() の使用が推奨されます。

> db.demo562.updateMany( {Name:{$exists:true} },{ $unset: {"Name":""}} );

4. 削除結果の確認

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

> db.demo562.find();

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

{ "_id" : ObjectId("5e8f4b6654b4472ed3e8e875"), "Age" : 21 }
{ "_id" : ObjectId("5e8f4b6754b4472ed3e8e876"), "Age" : 20 }
{ "_id" : ObjectId("5e8f4b6854b4472ed3e8e877"), "Age" : 23 }

すべてのドキュメントから Name フィールドが削除され、_id と Age のみが残っていることが確認できました。

まとめ

  • $exists: 特定のフィールドが存在するドキュメントを検索するために使用します。
  • $unset: ドキュメントから指定したフィールドを削除するために使用します。
  • {multi:true}: 条件に一致したすべてのドキュメントへ更新を適用します(updateMany() ではデフォルトで全件対象)。

このように、$exists と $unset を組み合わせることで、「特定のフィールドを持つレコードだけを対象に、そのフィールドをまとめて削除する」という操作を簡単に実現できます。

  1. MongoDBの大規模コレクションで検索が遅い?インデックス作成による高速化の方法

    MongoDBでコレクションのデータ量が増えてくると、検索速度が低下する問題に直面することがあります。このような場合、最も効果的な解決策はインデックス(index)を作成することです。インデックスを使用すると、コレクション全体をスキャンする必要がなくなり、クエリのパフォーマンスが大幅に向上します。インデックスの作成方法インデックスを作成するには、createIndex()メソッドを使用します。まず、サンプルとなるコレクションとドキュメントを作成してみましょう。> db.demo661.createIndex({ListOfName:1}); { createdCollection

  2. YouTubeの視聴履歴・検索履歴を削除する方法【コメント管理も解説】

    YouTubeで動画を再生したり検索したりすると、その記録はすべてアカウントに保存されます。YouTubeがこれを行うのは、ユーザーの閲覧傾向を把握し、次に表示するおすすめ動画を判断するためです。Google検索と同じように、この仕組みによってサイト内での検索や閲覧がよりスムーズになるというメリットもあります。 ただし、こうした記録を残したくない場合は、YouTubeからサインアウトするか、シークレットモード(プライベートブラウジング)を利用すれば履歴は保存されません。すでにログイン済みで、これまでの視聴履歴や検索アクティビティを削除したいという方は、以下の手順を参考にしてください。 You