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

MongoDBで二重にネストされた配列から要素を削除する方法($pull演算子の使い方)

MongoDBで二重にネストされた配列から要素を削除する方法

MongoDBのドキュメントには、配列の中にさらにオブジェクトや配列が入れ子になった「二重ネスト構造」を持たせることができます。このように深い階層にある配列から特定の要素を取り除きたい場合は、更新演算子 $pull を使うのが基本です。

本記事では、サンプルデータの作成から要素の削除、結果の確認までを一連の手順として解説します。

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

まずは動作確認のためのコレクションを用意します。次のクエリで、ユーザー情報を格納した2件のドキュメントを挿入しましょう。

> db.removeElementFromDoublyNestedArrayDemo.insertOne(
... {
...   "_id" : "1",
...   "UserName" : "Larry",
...   "UserDetails" : [
...     {
...       "UserCountryName" : "US",
...       "UserLocation" : [
...         { "UserCityName" : "New York" },
...         { "UserZipCode" : "10001" }
...       ]
...     }
...   ]
... }
... );
{ "acknowledged" : true, "insertedId" : "1" }

> db.removeElementFromDoublyNestedArrayDemo.insertOne(
... {
...   "_id" : "2",
...   "UserName" : "Mike",
...   "UserDetails" : [
...     {
...       "UserCountryName" : "UK",
...       "UserLocation" : [
...         { "UserCityName" : "Bangor" },
...         { "UserZipCode" : "20010" }
...       ]
...     }
...   ]
... }
... );
{ "acknowledged" : true, "insertedId" : "2" }

各ドキュメントは、UserDetails 配列の中に国名を含むオブジェクトがあり、その中の UserLocation 配列に都市名や郵便番号が格納される、二重のネスト構造になっています。

登録済みドキュメントの確認

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

> db.removeElementFromDoublyNestedArrayDemo.find().pretty();

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

{
	"_id" : "1",
	"UserName" : "Larry",
	"UserDetails" : [
		{
			"UserCountryName" : "US",
			"UserLocation" : [
				{
					"UserCityName" : "New York"
				},
				{
					"UserZipCode" : "10001"
				}
			]
		}
	]
}
{
	"_id" : "2",
	"UserName" : "Mike",
	"UserDetails" : [
		{
			"UserCountryName" : "UK",
			"UserLocation" : [
				{
					"UserCityName" : "Bangor"
				},
				{
					"UserZipCode" : "20010"
				}
			]
		}
	]
}

$pull演算子でネストされた配列の要素を削除する

それでは、二重にネストされた配列から要素を削除してみましょう。ポイントは、ドット記法(パス表記)によってネストされた配列の位置を正確に指定することです。

ここでは、_id が "2" のドキュメント(Mike)の UserLocation 配列から、郵便番号 "20010" の要素を削除します。

> db.removeElementFromDoublyNestedArrayDemo.update(
... { _id : "2" },
... {$pull : {"UserDetails.0.UserLocation" : {"UserZipCode":"20010"}}}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

クエリのポイントを整理すると、次のようになります。

  • { _id : "2" } … 更新対象のドキュメントを特定するための検索条件です。
  • "UserDetails.0.UserLocation" … UserDetails 配列の 0 番目(先頭)要素にある UserLocation 配列を指すパスです。
  • {"UserZipCode":"20010"} … 削除する要素の一致条件です。この条件に合致する要素だけが配列から取り除かれます。

実行結果の nModified : 1 は、1件のドキュメントが正常に更新されたことを示しています。

補足: MongoDB 4.2 以降では update() メソッドは非推奨となっています。新規の開発では updateOne()updateMany() の使用が推奨されます。

削除結果の確認

再度 find() を実行して、ドキュメントの状態を確認しましょう。

> db.removeElementFromDoublyNestedArrayDemo.find().pretty();

出力結果は以下の通りです。

{
	"_id" : "1",
	"UserName" : "Larry",
	"UserDetails" : [
		{
			"UserCountryName" : "US",
			"UserLocation" : [
				{
					"UserCityName" : "New York"
				},
				{
					"UserZipCode" : "10001"
				}
			]
		}
	]
}
{
	"_id" : "2",
	"UserName" : "Mike",
	"UserDetails" : [
		{
			"UserCountryName" : "UK",
			"UserLocation" : [
				{
					"UserCityName" : "Bangor"
				}
			]
		}
	]
}

_id が "2" のドキュメントを見ると、UserLocation 配列から "UserZipCode": "20010" の要素が削除され、"Bangor" のみが残っていることが分かります。

まとめ

MongoDBで二重にネストされた配列から要素を削除するには、$pull 演算子とドット記法によるパス指定を組み合わせます。「配列名.インデックス.配列名」という形式で対象の位置を正確に指定することが成功のポイントです。この手法は、より深いネスト構造にも応用できますので、ぜひ覚えておきましょう。

  1. Swiftの配列から特定の要素を削除する方法を徹底解説

    Swiftで配列から特定の要素を削除したい場合、いくつかの方法があります。この記事では、実際のコード例を交えながら、代表的な2つの方法をわかりやすく解説します。 まずは、String型の配列を用意しましょう。 var arrayOfString = [a,b,c,f] この配列を使って、以下の2つの方法で特定の要素を削除していきます。 方法1:filterメソッドを使う Swiftの配列にはfilterメソッドが標準で用意されています。これは、指定した条件に基づいて要素を絞り込み、新しい配列として返すメソッドです。削除したい要素を条件から除外することで、実質的にその要素を取り除くことができます

  2. C#の配列から要素を削除する方法【サンプルコード付きで解説】

    C#の配列は固定長のため、要素を直接「削除」することはできません。そこで一般的に用いられるのが、削除したい位置以降の要素を一つ前へずらす(シフトする)ことで、実質的にその要素を取り除く手法です。 基本的な考え方:要素をシフトして削除する まず、次のように5つの要素を持つ配列を用意します。 int[] arr = new int[5] {35, 50, 55, 77, 98}; たとえば2番目の位置(pos = 2、つまり arr[1])の要素「50」を削除したい場合は、その位置より後ろにある要素をすべて一つずつ前に移動させます。 // 削除位置以降の要素を前方へシフト for (i