MongoDB は配列から要素を削除する

Mehvish Ashiq 2023年1月30日
  1. MongoDB は配列から要素を削除する
  2. MongoDB $pull を使用して、ドキュメントの配列から要素を削除する
  3. MongoDB の $pullAll を使って配列から要素を削除する
  4. MongoDB $pop を使用して、配列から要素を削除する
  5. MongoDB $unset を使用して、指定された要素を含むフィールドを削除する
  6. MongoDB Positional Operator を使用して、要素を削除する代わりに null に設定する
MongoDB は配列から要素を削除する

プロジェクトの要件に応じて、さまざまなアプローチを採用できます。今日は、$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 演算子を使用して、フィルタークエリまたは指定された条件に一致する既存の配列から値のすべてのインスタンスを削除しています。

上記のコード例では、_idObjectId("62aae796f27219958a489b89") と等しいドキュメントを検索しています。ドキュメントが指定された条件に一致すると、contact.phone.number987546321 に等しい既存の配列からインスタンスを削除します。

$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 である配列の最初の要素を更新します。

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

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - MongoDB Array

関連記事 - MongoDB Document