【MongoDB】$pull演算子でドキュメントの配列から特定の値を削除する方法
MongoDBでは、update()メソッドと$pull演算子を組み合わせることで、ドキュメント内の配列フィールドから特定の値を簡単に取り除くことができます。
$pullは、指定した条件に一致する要素を配列からすべて削除する更新演算子です。この記事では、実際のコード例と実行結果をもとに、$pullの基本的な使い方を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを挿入してコレクションを作成します。insertOne()メソッドを使用します。
> db.demo318.insertOne({Subject:["MySQL","MongoDB","Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ea6df8647eb59e562062")
}
> db.demo318.insertOne({Subject:["Spring","Hibernate"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ea78f8647eb59e562063")
}上記の例では、「demo318」というコレクションに2つのドキュメントを挿入しました。各ドキュメントは「Subject」という配列フィールドを持っています。
2. 挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo318.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e50ea6df8647eb59e562062"), "Subject" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e50ea78f8647eb59e562063"), "Subject" : [ "Spring", "Hibernate" ] }3. $pull演算子で特定の値を削除する
ここからが本題です。次のクエリでは、$pull演算子を使って配列から「Hibernate」という値を削除します。
> db.demo318.update({Subject:"Hibernate"},{$pull:{"Subject":"Hibernate"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })クエリの構造を見てみましょう。
- 第1引数 {Subject:"Hibernate"}:更新対象のドキュメントを検索する条件です。「Subject」配列に「Hibernate」が含まれるドキュメントを指定しています。
- 第2引数 {$pull:{"Subject":"Hibernate"}}:マッチしたドキュメントの「Subject」配列から「Hibernate」を削除する更新操作です。
実行結果の「nModified : 1」は、1件のドキュメントが正常に更新されたことを示しています。
4. 削除後のドキュメントを確認する
もう一度find()メソッドを実行して、更新結果を確認しましょう。
> db.demo318.find();
出力は以下のようになります。
{ "_id" : ObjectId("5e50ea6df8647eb59e562062"), "Subject" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e50ea78f8647eb59e562063"), "Subject" : [ "Spring" ] }2つ目のドキュメントの「Subject」配列から「Hibernate」が削除され、「Spring」のみが残っていることが確認できます。
まとめ
MongoDBで配列から特定の値を削除したい場合は、update()メソッドと$pull演算子を組み合わせるのが基本です。条件に一致するドキュメントを絞り込み、$pullで削除したい値を指定するだけで、配列の要素を安全に取り除けます。
なお、最新のMongoDBでは update() の代わりに updateOne() や updateMany() の使用が推奨されています。複数のドキュメントから同じ値を一括で削除したい場合は updateMany() を使うと便利です。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "