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

MongoDBで別の配列内にネストされた配列から特定のレコードを削除する方法

MongoDBで、別の配列の中にネストされた配列から特定のレコード(要素)を削除したい場合は、$pull 演算子を使用します。本記事では、実際のコード例を通じて、ネストされた配列から条件に一致するレコードを削除する手順を詳しく解説します。

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

まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生情報の中に科目ごとの成績がネストされた構造を持つドキュメントを挿入します。

> db.deletingSpecificRecordDemo.insertOne(
   {
      "StudentDetails": [
         {
            "StudentName": "John",
            "StudentSubjectDetails": [
               {
                   "Subject": "MongoDB",
                   "Marks": 45
               },
               {
                   "Subject": "MySQL",
                   "Marks": 67
               }
            ]
         }
      ]
   }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cf2210ab64a577be5a2bc06")
}

挿入したドキュメントの確認

続いて、find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。

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

上記のクエリを実行すると、以下のドキュメントが出力されます。

{
   "_id" : ObjectId("5cf2210ab64a577be5a2bc06"),
   "StudentDetails" : [
      {
         "StudentName" : "John",
         "StudentSubjectDetails" : [
            {
               "Subject" : "MongoDB",
               "Marks" : 45
            },
            {
               "Subject" : "MySQL",
               "Marks" : 67
            }
         ]
      }
   ]
}

$pull演算子でネストされた配列からレコードを削除する

それでは、別の配列内にネストされた配列から特定のレコードを削除するクエリを見ていきましょう。ここでのポイントは、位置演算子「$」を使って、条件に一致した外側の配列要素を指定することです。

> db.deletingSpecificRecordDemo.update(
   {"_id": ObjectId("5cf2210ab64a577be5a2bc06"), "StudentDetails.StudentName" : "John"},
   {
      "$pull": {"StudentDetails.$.StudentSubjectDetails" : { "Marks": 45 }}
   }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

このクエリでは、以下のような処理が行われています。

  • _idStudentName: "John" を条件として、対象となるドキュメントを特定します。
  • $pull 演算子のパスに位置演算子「$」を指定することで、条件に一致した StudentDetails 要素内の StudentSubjectDetails 配列を参照します。
  • Marks: 45 に一致する要素(MongoDBの科目データ)を、ネストされた配列から削除します。

削除後のドキュメントを確認する

最後に、もう一度ドキュメントを表示して、レコードが正しく削除されたかどうかを確認しましょう。

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

実行結果は以下のとおりです。「Marks: 45」のレコードが削除され、「MySQL」のデータのみが残っていることがわかります。

{
   "_id" : ObjectId("5cf2210ab64a577be5a2bc06"),
   "StudentDetails" : [
      {
         "StudentName" : "John",
         "StudentSubjectDetails" : [
            {
               "Subject" : "MySQL",
               "Marks" : 67
            }
         ]
      }
   ]
}

まとめ

ネストされた配列から特定のレコードを削除するには、$pull 演算子と位置演算子「$」を組み合わせるのが効果的です。外側の配列に対する検索条件をクエリに含め、$pull のパスに「$」を指定することで、一致した要素の内側にある配列を操作できます。なお、最新バージョンのMongoDBでは、update() の代わりに updateOne() や updateMany() の使用が推奨されている点にも留意しておきましょう。

  1. MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)

    MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId

  2. MongoDBでオブジェクト配列内の特定のネストされたドキュメントをクエリする方法

    MongoDBでオブジェクトの配列からネストされたドキュメントを抽出する オブジェクトの配列に格納されたネストされたドキュメントを条件付きで検索したい場合、find()メソッドに$elemMatch演算子を組み合わせることで、指定した条件に一致する要素だけを取り出すことができます。 ここでは、「StudentAge」フィールドを持つ学生情報だけを配列から抽出する例を見ていきましょう。 1. サンプルコレクションの作成 まず、ドキュメントを挿入してコレクションを作成します。このコレクションには、学生情報がオブジェクトの配列として格納されています。 > db.demo763.insertO