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

MongoDBで部分的なデータを削除する方法【remove()とskip()を活用】

MongoDBで部分的なデータを削除するには?

MongoDBでは、条件に一致した一部のドキュメントだけをまとめて削除したいケースがあります。そのような場合には remove() メソッドを使用します。本記事では、find()skip() を組み合わせて、特定範囲のドキュメント(部分的なデータ)を削除する手順を解説します。

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

まずは動作確認用に、複数のドキュメントを含むコレクション「demo488」を作成します。

> db.demo488.insertOne({"Name":"Chris"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8351e0b0f3fa88e22790b2")
}
> db.demo488.insertOne({"Name":"David"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8351e8b0f3fa88e22790b3")
}
> db.demo488.insertOne({"Name":"Bob"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8351ebb0f3fa88e22790b4")
}
> db.demo488.insertOne({"Name":"Mike"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8351eeb0f3fa88e22790b5")
}
> db.demo488.insertOne({"Name":"Sam"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e835202b0f3fa88e22790b6")
}
> db.demo488.insertOne({"Name":"John"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e835207b0f3fa88e22790b7")
}
> db.demo488.insertOne({"Name":"Robert"});{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e83520cb0f3fa88e22790b8")
}

これで7件のドキュメントが登録されました。

2. 現在のドキュメントを確認する

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

> db.demo488.find();

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

{ "_id" : ObjectId("5e8351e0b0f3fa88e22790b2"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8351e8b0f3fa88e22790b3"), "Name" : "David" }
{ "_id" : ObjectId("5e8351ebb0f3fa88e22790b4"), "Name" : "Bob" }
{ "_id" : ObjectId("5e8351eeb0f3fa88e22790b5"), "Name" : "Mike" }
{ "_id" : ObjectId("5e835202b0f3fa88e22790b6"), "Name" : "Sam" }
{ "_id" : ObjectId("5e835207b0f3fa88e22790b7"), "Name" : "John" }
{ "_id" : ObjectId("5e83520cb0f3fa88e22790b8"), "Name" : "Robert" }

3. 部分的なデータを削除するクエリ

以下が、MongoDBで部分的なデータを削除するためのクエリです。ここでは「先頭4件をスキップし、残りの3件を削除対象」としています。

> var deleteData = db.demo488.find({}, {_id : 1}).skip(4).toArray().map(function(d) { return d._id; });
> db.demo488.remove({_id: {$in: deleteData}})
WriteResult({ "nRemoved" : 3 })

処理の流れを解説します。

  • find({}, {_id : 1}):全ドキュメントから _id フィールドのみを取得します。
  • skip(4):先頭の4件を読み飛ばし、5件目以降を対象にします。
  • toArray().map(...):結果を配列化し、_id のリストとして変数 deleteData に格納します。
  • remove({_id: {$in: deleteData}}):$in 演算子を使い、deleteData に含まれる _id を持つドキュメントを一括削除します。

結果として nRemoved : 3 が出力され、3件のドキュメントが削除されたことがわかります。

4. 削除後の状態を確認する

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

> db.demo488.find();

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

{ "_id" : ObjectId("5e8351e0b0f3fa88e22790b2"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8351e8b0f3fa88e22790b3"), "Name" : "David" }
{ "_id" : ObjectId("5e8351ebb0f3fa88e22790b4"), "Name" : "Bob" }
{ "_id" : ObjectId("5e8351eeb0f3fa88e22790b5"), "Name" : "Mike" }

先頭の4件(Chris、David、Bob、Mike)だけが残り、後半の3件(Sam、John、Robert)が正常に削除されていることが確認できます。

補足:最新バージョンでの注意点

MongoDB 5.0以降では、remove() メソッドは非推奨となっています。代わりに deleteMany()deleteOne() の使用が推奨されます。上記の例を新しい構文に置き換える場合は、次のように記述できます。

> db.demo488.deleteMany({_id: {$in: deleteData}})

このように、find()・skip()・$in 演算子を組み合わせることで、「何件目以降を削除する」といった柔軟な部分削除が簡単に実現できます。

  1. iPhoneでスクリーンタイムのデータと履歴を削除する方法【パスコードを忘れたときの対処法も解説】

    この記事のポイント スクリーンタイムの履歴を削除するには、「設定」>「スクリーンタイム」>「スクリーンタイムをオフにする」の順に進みます。 スクリーンタイムを再度オンにしても、以前のデータは復元されません。 この記事では、iPhoneからスクリーンタイムのデータを削除する方法を詳しく解説します。 スクリーンタイム自体を削除することはできる? スクリーンタイムはiOSに標準搭載されている機能のため、本体から完全に削除することはできません。削除できるのは、スクリーンタイムに関連付けられたデータだけです。機能をオフにすると、それ以降は各アプリの使用時間が記録されなくなります。 以下

  2. Googleアカウントに保存されたデータを削除する完全ガイド

    Googleのサービスを日常的に使っているなら、同社が自分に関する膨大な情報を保有していることをご存じでしょう。幸い、その多くは一箇所にまとめられており、ダウンロードするだけでなく削除することも可能です。 ここで注意したいのは、Googleアカウントのデータを削除しても、アカウント自体が消えるわけではないという点です。Gmailのメール、YouTubeチャンネル、Googleドライブのファイルなどが失われることはありません。データを消去するというのは、Googleが記録している「あなたに関する履歴」——ウェブ検索の内容、デバイスで開いたアプリ、YouTubeで視聴した動画など——を取り除くこ