MongoDBでネストされた配列から特定のレコードを削除する方法($pull演算子の使い方)
MongoDBでは、配列の中にさらに配列がネストしている複雑なドキュメント構造を扱うことができます。この記事では、別の配列内にネストされた配列から特定のレコードを削除する方法を、実際のコード例とともに解説します。
特定のレコードを削除するには $pull 演算子を使用します。また、すでに作成済みのコレクションを更新するため、update() メソッドと組み合わせます。ネストされた配列の要素を指定する際は、位置演算子 $ を活用するのがポイントです。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。insertOne() メソッドを使って、「details1」配列の中に「details2」というネストされた配列を持つドキュメントを挿入します。
> db.demo213.insertOne({
... "id": 101,
... "details1": [
... {
... "Name": "Chris",
... "details2": [
... {
... "StudentName": "David",
... "Subject": "MongoDB"
... },
... {
... "StudentName": "Mike",
... "Subject": "MySQL"
... }
... ]
... }
... ]
...});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3e300c03d395bdc2134704")
}挿入したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo213.find().pretty();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e3e300c03d395bdc2134704"),
"id" : 101,
"details1" : [
{
"Name" : "Chris",
"details2" : [
{
"StudentName" : "David",
"Subject" : "MongoDB"
},
{
"StudentName" : "Mike",
"Subject" : "MySQL"
}
]
}
]
}現時点では、「details2」配列には「David(MongoDB)」と「Mike(MySQL)」という2件の学生レコードが格納されています。
ネストされた配列から特定のレコードを削除するクエリ
ここからが本題です。別の配列内にネストされた配列から特定のレコードを削除するには、検索条件で親配列の要素を特定し、$pull と位置演算子 $ を組み合わせて更新を行います。
次のクエリでは、「Name」が「Chris」である要素の「details2」配列から、「Subject」が「MySQL」のレコードを削除しています。
> db.demo213.update({"id": 101, "details1.Name": "Chris"},
... {
... "$pull": {"details1.$.details2" : { "Subject": "MySQL" }}
... }, multi=true
...)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })クエリのポイント解説
- 検索条件:
{"id": 101, "details1.Name": "Chris"}により、対象となるドキュメントと親配列「details1」内の要素を特定します。 - 位置演算子 $:
details1.$と記述することで、検索条件にマッチした配列要素を自動的に参照できます。 - $pull 演算子:
{ "Subject": "MySQL" }に一致する要素を「details2」配列から取り除きます。
実行結果の WriteResult で nModified : 1 と表示されていれば、更新が正常に完了しています。
削除後のドキュメント確認
再度 find() メソッドでコレクションの内容を確認しましょう。
> db.demo213.find().pretty();
実行すると、次の出力が得られます。
{
"_id" : ObjectId("5e3e300c03d395bdc2134704"),
"id" : 101,
"details1" : [
{
"Name" : "Chris",
"details2" : [
{
"StudentName" : "David",
"Subject" : "MongoDB"
}
]
}
]
}出力結果を見ると、「Subject」が「MySQL」のMikeのレコードが削除され、「details2」配列にはDavidのレコードのみが残っていることがわかります。
まとめ
MongoDBでネストされた配列から特定のレコードを削除する手順をまとめると、以下の通りです。
update()メソッドの検索条件で、対象ドキュメントと親配列の要素を特定する$pull演算子と位置演算子$を組み合わせて、ネストされた配列内の一致する要素を削除するfind()メソッドで結果を確認する
なお、新しいバージョンのMongoDBでは update() の代わりに updateOne() や updateMany() の使用が推奨されています。これらのメソッドでも同様に $pull 演算子を使用できるため、用途に応じて使い分けるとよいでしょう。
-
MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)
MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId
-
MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法
MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO