MongoDB は配列から要素を削除する
- MongoDB は配列から要素を削除する
-
MongoDB
$pullを使用して、ドキュメントの配列から要素を削除する -
MongoDB の
$pullAllを使って配列から要素を削除する -
MongoDB
$popを使用して、配列から要素を削除する -
MongoDB
$unsetを使用して、指定された要素を含むフィールドを削除する -
MongoDB Positional Operator を使用して、要素を削除する代わりに
nullに設定する
プロジェクトの要件に応じて、さまざまなアプローチを採用できます。今日は、$pull、$pullAll、$pop、$unset、および位置演算子($)を使用して MongoDB の配列やドキュメントの配列から要素を削除する方法を学びます。
MongoDB は配列から要素を削除する
上記のすべての方法を実践するには、サンプルドキュメントコレクションが必要です。collection という名前のコレクションを作成し、1つのドキュメントのみを挿入します。
1つのドキュメントを含む次のコレクションを使用することもできます。
サンプルコード:
// MongoDB version 5.0.8
> db.collection.insertMany([
{
contact: {
phone: [
{"type" : "UAN", "number" : "123456789"},
{"type" : "office", "number" : "987546321"},
{"type" : "personal", "number" : "852147963"}
]
},
services: ["Google", "Instagram", "Twitter", "Facebook"],
scores: [ 0, 1, 8, 17, 18, 8, 20, 10 ]
},
{
contact: {
phone: [
{"type" : "UAN", "number" : "456321879"},
{"type" : "office", "number" : "874596321"},
{"type" : "personal", "number" : "964785123"}
]
},
services: ["Google", "Instagram", "Twitter"],
scores: [ 1, 8, 2, 3, 8, 7, 1 ]
}
]);
collection という名前のコレクションがない場合でも、心配する必要はありません。上記のクエリはあなたのためにそれを作成し、それを入力します。次に、db.collection.find().pretty() を実行して、挿入されたドキュメントを確認します。
今後のコード例を実行した後は、更新されたドキュメントは表示されないことに注意してください。そのためには、db.collection.find().pretty() コマンドを実行する必要があります。
MongoDB $pull を使用して、ドキュメントの配列から要素を削除する
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{ _id : ObjectId("62aae796f27219958a489b89") },
{ $pull : { "contact.phone": { "number": "987546321" } } }
);
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "UAN", "number" : "123456789" },
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
"scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "UAN", "number" : "456321879" },
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Google", "Instagram", "Twitter" ],
"scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}
ここでは、$pull 演算子を使用して、フィルタークエリまたは指定された条件に一致する既存の配列から値のすべてのインスタンスを削除しています。
上記のコード例では、_id が ObjectId("62aae796f27219958a489b89") と等しいドキュメントを検索しています。ドキュメントが指定された条件に一致すると、contact.phone.number が 987546321 に等しい既存の配列からインスタンスを削除します。
$pull 演算子を使用するときは、次の点に注意してください。
- 削除する必要のある指定された
値が配列の場合、$pull演算子は、指定された値(順序を含む)を満たす配列からのみ要素を削除します。 - 削除する必要のある特定の
値がドキュメントの場合、$pull演算子は、正確なフィールドと値を含む配列からのみ要素を削除します。ここでは、フィールドの順序が異なる場合があります。 - 指定された
条件と配列の要素が埋め込みドキュメントである場合、$pull演算子は、すべての配列要素がコレクション内のドキュメントであるかのように条件を適用します。詳しくはこちらをご確認ください。
ここで、コレクション内のすべてのドキュメントに対して削除操作を実行したいという別の状況があります。これを行うには、$pull を使用して次の構文を使用しますが、{multi: true} は指定された条件のすべてのドキュメントで動作します。
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update({},
{ $pull: { "contact.phone": { "type": "UAN" } } },
{ multi: true }
);
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
"scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Google", "Instagram", "Twitter" ],
"scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}
上記の出力を取得するには、contact.phone.type が"UAN"と等しいコレクション内のすべてのドキュメントから配列要素を削除します。
次のタスクは、値が 2 以上で 6 以下(2<= value <=6)の要素を scores 配列から削除することです。次のクエリを実行して、選択したコレクションのすべてのドキュメントに対して実行します。
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{},
{ $pull : { scores : {$gte: 2, $lte: 6} } },
{ multi: true }
)
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
"scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Google", "Instagram", "Twitter" ],
"scores" : [ 1, 8, 8, 7, 1 ]
}
文字列型の値で練習するには、次の方法で行うことができます。
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{},
{ $pull: { "services": { $in: [ "Google", "Instagram" ] }, "scores": 1 } },
{ multi: true }
)
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ],
"scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 8, 8, 7 ]
}
このコード例では、$in 比較演算子を使用して値の配列を取得し、値が存在する場合はそれらを services 配列から削除します。
さらに、$pull 演算子を使用してこのすべての削除操作を実行しているときに、scores 配列から 1 が存在する場合は削除します。
MongoDB の $pullAll を使って配列から要素を削除する
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{ _id: ObjectId("62aae796f27219958a489b8a") },
{ $pullAll: { "scores": [8] } }
)
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ],
"scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
このコードでは、$pullAll 演算子を使用して、既存の配列から指定された値のすべてのオカレンス(インスタンス)を削除しています。たとえば、8 という数字が scores 配列に 2 回出現する場合、両方の 8 値が削除されます。
フィルタクエリを指定して配列要素を削除する $pull 演算子と同様に、$pullAll はリストされた値に一致する配列要素を削除/削除します。
ドット表記を使用して、配列の埋め込みドキュメントを処理します。
MongoDB $pop を使用して、配列から要素を削除する
配列から最初または最後の要素を削除する場合は、$pop 演算子を使用できます。このために、-1 または 1 を $pop 演算子に渡して、最初または最後から配列要素を削除します。
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{ _id: ObjectId("62aae796f27219958a489b89") },
{ $pop: { "scores": -1 } }
)
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ],
"scores" : [ 8, 17, 18, 8, 20, 10 ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
MongoDB $unset を使用して、指定された要素を含むフィールドを削除する
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{ _id : ObjectId("62aae796f27219958a489b89") },
{ $unset : {"scores" : 8 }}
)
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", "Facebook" ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
ここでは、$unset 演算子を使用して、指定された値を含む特定のフィールドを削除します。たとえば、フィルタークエリに一致し、配列要素として 8 を含む scores フィールドを削除します。
位置演算子($)とともに $unset 演算子を使用すると、一致する要素は削除されず、null に設定されることに注意してください。それを実践するには、次のセクションを参照してください。
MongoDB Positional Operator を使用して、要素を削除する代わりに null に設定する
サンプルコード:
// MongoDB version 5.0.8
> db.collection.update(
{"services": "Facebook"},
{ $unset: {"services.$" : 1}}
)
出力:
{
"_id" : ObjectId("62aae796f27219958a489b89"),
"contact" : {
"phone" : [
{ "type" : "personal", "number" : "852147963" }
]
},
"services" : [ "Twitter", null ]
}
{
"_id" : ObjectId("62aae796f27219958a489b8a"),
"contact" : {
"phone" : [
{ "type" : "office", "number" : "874596321" },
{ "type" : "personal", "number" : "964785123" }
]
},
"services" : [ "Twitter" ],
"scores" : [ 7 ]
}
このコードスニペットは、位置演算子とともに $unset を使用して、配列の要素を削除するのではなく、null に設定します。 $ を使用して、services 配列の値が Facebook である配列の最初の要素を更新します。
このアプローチは、配列の要素の位置がわからない場合に使用できます。一方、指定された配列フィールドのすべての要素を更新する場合は、$[](すべての位置演算子)を使用することもできます。
