ポイント: MongoDBのプッシュおよびプル演算子は、ドキュメント内の配列を変更するために、要素を追加または削除するために使用されます。$push演算子は値を追加し、$pull演算子は特定の条件に基づいて要素を削除します。このガイドでは、構文、使用法、および$each、$sort、および$positionのような修飾子について説明し、ユーザー向けの実用的な例を提供します。
- $pushは配列に値を追加し、存在しない場合は新しい配列を作成できます。
- $pullは条件に基づいて配列から指定された値を削除します。
$pushおよび$pull演算子は、MongoDBドキュメント内の配列を修正するために設計された配列演算子の一部です。 このチュートリアルでは、pushおよびpull演算子がどのように機能するか、追加の修飾子および条件と共にそれらを使用する方法を示します。
$pushおよび$pull演算子とは何ですか?
PushおよびPullは、MongoDBドキュメント内の配列に要素を追加および削除するために使用される2つの操作です。要素の追加と削除は、それぞれMongoDBの$pushおよび$pull演算子を使用して行われます:
- $push演算子は、指定された値を配列に追加します。
- $pull演算子は、指定された条件に一致する配列から値を削除します。
$push演算子の基本構文
{ $push: { : , ... } }
$pull演算子の基本構文
{ $pull: { : , ... } }
それぞれについて、どのように機能するか、またどのように使用できるかを詳しく見ていきましょう。
MongoDBの$push演算子の動作
$push演算子は2つの引数を取ります:
- 配列フィールド
- 指定された配列フィールドに追加される値
配列フィールドがドキュメントに存在しない場合、$push演算子は新しい配列フィールドを作成します。しかし、指定されたフィールドが配列でない場合、MongoDBはエラーを返します。
$push演算子の修飾子
$push演算子の機能は、次の修飾子を使用してさらに拡張できます。
- $each. $each修飾子は、配列に複数の値を追加するために使用されます。$each演算子が指定されていない場合、$push演算子内のすべての値は、ドキュメント内の配列フィールドに単一のアイテムとして追加されます。
- $slice. これは、配列内の要素の数を制限します。ただし、これは$each修飾子と共に使用しなければなりません。
- $sort. $sort修飾子は、配列内のアイテムを順序付けます。この修飾子も$each修飾子を使用する必要があります。
- $position. $push演算子はデフォルトで配列の末尾に新しいアイテムを追加します。アイテムを追加する場所を明示的に指定したい場合は、$position修飾子を使用します。
$push操作は、修飾子が定義される順序に関係なく、次の順序で実行されます:
- 指定された位置に要素を追加するために配列を更新します。
- $sort修飾子が指定されている場合は配列をソートします。
- $slice修飾子が指定されている場合は配列をスライスします。
- 配列を保存します。
次に、MongoDBの$push操作を使用してドキュメントを操作する方法を見ていきます。いくつかの例を示しますので、必要なものにジャンプしてください:
これらの例の基本データセットとして、「vehicledetails」コレクションを使用します。
db.vehicledetails.find().pretty()
結果:
配列に単一の値を追加
配列フィールドが存在する場合と存在しない場合の両方で、配列に単一の値を追加する方法を見てみましょう。すべての例で、「_id」フィールドは配列を追加すべきドキュメントを示すために使用されます。 例:配列フィールドが存在しない $push演算子で指定されたフィールド名の新しい配列フィールドが作成されます。
db.vehicledetails.update({"_id": ObjectId("5fbc52f05f9a62418038240d")}, {$push: {"vehicle_colours": "red"}})
結果:
例:配列フィールドが存在する場合 新しいアイテムは配列の末尾に追加されます。
db.vehicledetails.update({"_id": ObjectId("5fbc52f05f9a62418038240d")}, {$push: {"vehicle_colours": "green"}})
結果:
非配列フィールドに$push演算子を使用しようとすると、エラーが発生します。以下のコードは、非配列フィールド「make」に値を追加しようとしているため、エラーを返します。
db.vehicledetails.update({"_id": ObjectId("5fbc52f05f9a62418038240d")}, {$push: {"make": "green"}})
結果:
配列に複数の値を追加
$each修飾子の有無にかかわらず、配列に複数の値を追加できます。 例:$each修飾子なしでの複数の値 $each修飾子が存在しない場合、MongoDBは指定された配列フィールドにすべての値を単一の値として追加します。
db.vehicledetails.update({"_id": ObjectId("5fbc52f55f9a62418038240e")}, {$push: {"vehicle_colours": ["blue", "red", "yellow"]}})
結果:
ここでは、「青」、「赤」、「黄色」が新しく作成された配列の要素であることがわかります。しかし、その配列は「vehical_colours」配列の1つの要素に過ぎません。 例:$each修飾子を使用しての複数の値 $push操作が$each修飾子で定義されている場合、$push操作の各要素は個別のアイテムとして配列に追加されます。
db.vehicledetails.update({"_id": ObjectId("5fbc52f55f9a62418038240e")}, {$push: {"vehicle_colours": { $each :["blue", "red", "yellow"]}}})
結果:
ここで、「vehicle_colours」には$push操作の後に3つの要素があります。
$sortおよび$slice修飾子の使用
このセクションでは、「vehicledetails」コレクション内の次のドキュメントを使用して、$sortおよび$slice修飾子の使用方法を示します。
「vehicle_colours」配列フィールドに「銀色」を追加し、内容をアルファベット順(昇順)にソートします。
db.vehicledetails.update({"_id": ObjectId("5fbc52fb5f9a62418038240f")}, {$push: {"vehicle_colours": { $each :["silver", "orange"], $sort: 1}}})
結果:
上記の出力は、新しい色が追加され、配列がアルファベット順にソートされたことを示しています。次の例では、「ダークブルー」という色を配列フィールドに追加し、アルファベット順にソートし、$slice修飾子を使用して配列を5つの要素に制限します。
db.vehicledetails.update({"_id": ObjectId("5fbc52fb5f9a62418038240f")}, {$push: {"vehicle_colours": { $each :["dark blue"], $sort: 1, $slice: 5}}})
結果:
$position修飾子の使用
$position修飾子は、新しいアイテムを追加する配列内の位置を指定するために使用されます。これにより、アイテムを配列の最後に追加するというデフォルトの動作が上書きされます。次の例では、「vehicle_colours」という配列フィールドの先頭に「白」という色を追加します。「$position」修飾子では、ゼロ(0)が配列の最初の位置(インデックス0)を示すために使用されます。
db.vehicledetails.update({"_id": ObjectId("5fbc52fb5f9a62418038240f")}, {$push: {"vehicle_colours": { $each :["white"], $position: 0}}})
結果:
MongoDBの$pull演算子の動作
$pull演算子は、指定された条件と一致するMongoDBドキュメントから値または値のすべてのインスタンスを削除するために使用されます。配列に埋め込まれたまたはネストされたドキュメントが含まれている場合、指定された$pull演算子条件は、各配列要素がコレクション内のドキュメントであるかのように各配列要素に適用されます。削除する指定された値が配列である場合、$pull演算子は、要素が定義された順序を含む、指定された値と一致する配列内の要素のみを削除します。削除する指定された値がドキュメントである場合、$pull演算子は、指定されたフィールドと値に一致する要素を削除します。この場合、フィールドの順序は無視されます。では、$pull演算子のいくつかの例を見てみましょう。必要なものにジャンプしてください:
これらの例では、次のデータセットを使用してデモを行います。
配列から単一のアイテムを削除
ここでは、「model_year」配列フィールドから単一の値「2018」を削除します。「_id」フィールドは、$pull演算子が発生するドキュメントを示すために使用されます。
db.vehicledetails.update({"_id": ObjectId("5fbc52fb5f9a62418038240f")}, {$pull: {"model_year": 2018}})
結果:
指定された値に等しいすべてのアイテムを削除
この例では、「vehicle_colours」配列フィールドから「青」と「緑」の色を削除し、「model_year」配列フィールドから2020年のモデル年を削除するために「vehicledetails」コレクションを使用します。
db.vehicledetails.update({}, {$pull: {"vehicle_colours": { $in: ["blue", "green"]}, "model_year": 2020}},{multi: true})
結果:
指定された$pull条件に一致するアイテムを削除
「student_grades」コレクションを使用して、指定された条件に基づいて50以下のすべての成績を削除します。未変更ドキュメント:
変更されたドキュメント:
db.student_grades.update({"_id" : ObjectId("5fbed0faa94306028d2d7520")}, {$pull: {"grades": {$lte: 50}}})
結果:
指定された条件({$lte: 50})は、「grades」配列フィールド内の50以下のアイテムを削除しました。
ドキュメントの配列からアイテムを削除
この例では、「student_grades」コレクションを使用して、コレクション内のすべてのドキュメントの「grades」配列フィールド内で50以下のすべての値を削除します。未変更コレクション:
変更されたコレクション:
db.student_grades.update({}, {$pull: {"grades": {$lte: 50}}},{multi: true})
結果:
上記の出力は、「student_grades」コレクション内のすべてのドキュメントの「grades」配列フィールドから50以下の値が削除されたことを示しています。これでこのチュートリアルは終了です。
関連読み物
MongoDBガイド
- MongoDBの概要:MongoDBの始め方
- UbuntuおよびMacにMongoDBをインストールする方法
- MongoDBにおけるデータベースの作成
- MongoDBシェルの基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBの役割ベースのアクセス制御(RBAC)の説明
- MongoDBの投影および投影演算子の説明
- MongoDBの集約関数の説明
- MongoDBのソート:sort()メソッドと例
- MongoDBにおけるPushおよびPull演算子の使用
- MongoDBの$unwindの使用方法
- 23の一般的なMongoDBクエリ演算子とその使用方法
- MongoDBジオロケーションクエリの例
- MongoDBトランザクションの紹介
- MongoDBインデックス:主要なインデックスタイプとその管理方法
- 知っておくべき主要なMongoDBコマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスターの設定方法
- MongoDBのシャーディング:概念、例、チュートリアル
- MongoDB Atlas:管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBのメモリ使用量、管理、および要件
- MongoDBバックアップのためのmongodumpの使用方法
- MongoDBバックアップの復元のためのmongorestoreの例
- PyMongoの使用方法
- MongoDBおよびNodeJS用のMongooseの使用方法
- MongoDBチートシート
- MongoDB対Cassandra:NoSQLデータベースの比較
- PostgreSQL対MongoDB:データベースの比較
- MySQL対MongoDB:データベースの比較
- MongoDB認定:紹介
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。