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
である配列の最初の要素を更新します。
このアプローチは、配列の要素の位置がわからない場合に使用できます。一方、指定された配列フィールドのすべての要素を更新する場合は、$[]
(すべての位置演算子)を使用することもできます。