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

MongoDBで部分的なデータを削除する方法|map()とskip()を活用した実践テクニック

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

MongoDBでは、map()メソッドを活用することで、コレクション内の一部のドキュメントだけを効率的に削除できます。この記事では、実際のコード例を交えながら、「先頭の数件を残して残りを一括削除する」手順を詳しく解説します。

1. テスト用コレクションの作成

まずは、サンプル用のコレクション「deleteDemo」を作成し、複数のドキュメントを挿入していきます。

> db.deleteDemo.insertOne({"Name":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd550492cba06f46efe9f06")
}
> db.deleteDemo.insertOne({"Name":"Carol"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd5504d2cba06f46efe9f07")
}
> db.deleteDemo.insertOne({"Name":"Sam"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd550512cba06f46efe9f08")
}
> db.deleteDemo.insertOne({"Name":"David"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd5505d2cba06f46efe9f09")
}
> db.deleteDemo.insertOne({"Name":"Robert"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd550682cba06f46efe9f0a")
}
> db.deleteDemo.insertOne({"Name":"Chris"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd5506f2cba06f46efe9f0b")
}
> db.deleteDemo.insertOne({"Name":"Mike"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd550752cba06f46efe9f0c")
}
> db.deleteDemo.insertOne({"Name":"Bob"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd5507a2cba06f46efe9f0d")
}
> db.deleteDemo.insertOne({"Name":"James"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd550822cba06f46efe9f0e")
}
> db.deleteDemo.insertOne({"Name":"Jace"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd550862cba06f46efe9f0f")
}

上記のコマンドでは、insertOne()メソッドを使って、John、Carol、Sam、David、Robert、Chris、Mike、Bob、James、Jaceという10件のドキュメントを順番に登録しています。

2. 登録されたドキュメントを確認する

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

> db.deleteDemo.find();

実行結果は以下の通りです。

{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }
{ "_id" : ObjectId("5cd5506f2cba06f46efe9f0b"), "Name" : "Chris" }
{ "_id" : ObjectId("5cd550752cba06f46efe9f0c"), "Name" : "Mike" }
{ "_id" : ObjectId("5cd5507a2cba06f46efe9f0d"), "Name" : "Bob" }
{ "_id" : ObjectId("5cd550822cba06f46efe9f0e"), "Name" : "James" }
{ "_id" : ObjectId("5cd550862cba06f46efe9f0f"), "Name" : "Jace" }

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

ここからが本題です。以下のクエリを実行すると、MongoDBで部分的なデータを削除できます。この例では、先頭から5件目より後のドキュメント(6件目以降)をすべて削除します。

> var value = db.deleteDemo.find({}, {_id : 1}).skip(5).toArray().map(function(documentValue) { return documentValue._id; });
> db.deleteDemo.remove({_id: {$in:value}});
WriteResult({ "nRemoved" : 5 })

このクエリの動作を分解して見てみましょう。

  • find({}, {_id: 1}):全ドキュメントの _id フィールドのみを取得します。
  • .skip(5):先頭の5件をスキップし、6件目以降のドキュメントを対象にします。
  • .toArray():カーソルの結果を配列に変換します。
  • .map(...):各ドキュメントから _id の値だけを抽出し、配列として返します。
  • remove({_id: {$in: value}}):抽出した _id のリストに一致するドキュメントをまとめて削除します。

実行結果の「nRemoved : 5」は、5件のドキュメントが削除されたことを示しています。

4. 削除後のコレクションを確認する

最後に、再度 find() を実行して、削除後の状態を確認しましょう。

> db.deleteDemo.find();

実行結果は以下の通りです。

{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }

このように、先頭の5件(John、Carol、Sam、David、Robert)だけが残り、6件目以降のデータが正常に削除されていることが確認できました。

補足:remove()とdeleteMany()の違い

なお、remove()メソッドは新しいバージョンのMongoDBでは非推奨(deprecated)となっており、現在はdeleteMany()deleteOne()の使用が推奨されています。同じ処理は次のように書き換えることができます。

> db.deleteDemo.deleteMany({_id: {$in: value}});

本番環境では、こちらの新しいメソッドを使うことで、より安全で将来性のあるコードになります。

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

    MongoDBで部分的なデータを削除するには?MongoDBでは、条件に一致した一部のドキュメントだけをまとめて削除したいケースがあります。そのような場合には remove() メソッドを使用します。本記事では、find() と skip() を組み合わせて、特定範囲のドキュメント(部分的なデータ)を削除する手順を解説します。1. サンプルコレクションの作成まずは動作確認用に、複数のドキュメントを含むコレクション「demo488」を作成します。> db.demo488.insertOne({Name:Chris});{ acknowledged : true, inserte

  2. MongoDB運用に役立つヒント集:パート1

    本記事はTricoreが2017年8月2日に公開した記事をもとにしています。 MongoDBは導入のハードルが低く、手軽に使い始められるデータベースです。しかし、実際にアプリケーションを構築し始めると、より複雑な課題に直面することが少なくありません。たとえば、次のような疑問が浮かぶかもしれません。 レプリカセット内のメンバーを再同期するにはどうすればよいのか? クラッシュ後にMongoDBを復旧させるには? ファイルの保存・取得にGridFSを使うべきケースはいつか? 破損したデータはどうやって修復するのか? この記事では、MongoDBを使用する際にこうした状況へ対処するための実用的なヒ