MongoDBでコレクションから配列フィールド全体を削除するクエリの書き方
MongoDBで配列フィールドを完全に削除するには
MongoDBのコレクションから、ドキュメント内の配列フィールドそのもの(フィールドごと)を取り除きたい場合は、更新演算子の $unset を使用します。$unset は指定したフィールドをドキュメントから削除する演算子で、配列の中身だけを空にするのではなく、フィールド自体が存在しない状態にできます。
ここでは、サンプルコレクションを作成して、実際に配列フィールドを削除する手順を見ていきましょう。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使ってドキュメントを挿入し、テスト用のコレクション demo609 を作成します。
> db.demo609.insertOne({"ListOfSubject":["MySQL","MongoDB"]});{
"acknowledged" : true, "insertedId" : ObjectId("5e974695f57d0dc0b182d62c")
}
> db.demo609.insertOne({"ListOfSubject":["Java"]});{
"acknowledged" : true, "insertedId" : ObjectId("5e97469af57d0dc0b182d62d")
}2. ドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo609.find();
実行すると、次のような出力が得られます。各ドキュメントに ListOfSubject という配列フィールドが含まれていることがわかります。
{ "_id" : ObjectId("5e974695f57d0dc0b182d62c"), "ListOfSubject" : [ "MySQL", "MongoDB" ] }
{ "_id" : ObjectId("5e97469af57d0dc0b182d62d"), "ListOfSubject" : [ "Java" ] }3. $unset で配列フィールドを一括削除する
ここが本題です。update() メソッドと $unset 演算子を組み合わせて、全ドキュメントから ListOfSubject フィールドを削除します。ポイントは第3引数に { multi: true } を指定することです。これを忘れると、条件に一致した最初の1件しか更新されないため注意が必要です。
> db.demo609.update({},{$unset:{"ListOfSubject":""}},{multi:true});
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })結果を見ると、2件のドキュメントが一致し(nMatched: 2)、2件が更新された(nModified: 2)ことが確認できます。
4. 削除後のドキュメントを確認
再度 find() メソッドでコレクションの内容を表示してみましょう。
> db.demo609.find();
出力は以下のようになります。ListOfSubject フィールドが完全に消え、_id のみが残っていることがわかります。
{ "_id" : ObjectId("5e974695f57d0dc0b182d62c") }
{ "_id" : ObjectId("5e97469af57d0dc0b182d62d") }補足:$pull や $set との違い
なお、目的によって使い分ける演算子が異なる点にも注意してください。
$unset … フィールド自体をドキュメントから削除します(本記事のケース)。
$pull … 配列フィールドは残したまま、特定の要素だけを配列から取り除きます。
$set … フィールドの値を上書きするため、空の配列 [] をセットすれば「中身だけ空にする」ことも可能です。
配列の中身だけを消したいのか、フィールドごと消したいのかによって適切な演算子を選びましょう。フィールドを完全に削除したい場合は、今回のように $unset と { multi: true } の組み合わせが最もシンプルで確実な方法です。
-
MongoDBでコレクションの名前を変更する方法(renameCollectionの使い方)
MongoDBで既存のコレクションの名前を変更したい場合、renameCollection()メソッドを使用します。この記事では、実際にコレクションを作成し、その名前を変更するまでの手順を順番に解説します。1. ドキュメントを含むコレクションを作成するまず、insertOne()メソッドを使ってサンプルドキュメントを挿入し、コレクション「demo690」を作成します。> db.demo690.insertOne({_id:101,Name:Sam}); { acknowledged : true, insertedId : 101 } > db.demo690.insertOne(
-
MongoDBコレクションから重複を削除する方法|unique制約の使い方を解説
MongoDBコレクションから重複を削除する方法MongoDBのコレクションに重複データが登録されるのを防ぎたい場合は、ユニーク制約(unique: true)を設定するのが最も基本的かつ確実な方法です。対象フィールドにユニークインデックスを作成しておくことで、同じ値を持つドキュメントの挿入が自動的に拒否され、コレクション内に重複が存在しない状態を維持できます。基本構文以下のように、コレクション名とフィールド名を指定してユニークインデックスを作成します。「dropDups: true」を付けることで、インデックス作成時点で既に存在していた重複ドキュメントも削除され、各グループの最初の1件のみが