$push
定義
$push
$push
演算子は指定された値を配列に追加します。
互換性
次の環境でホストされる配置には $push
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$push
演算子の形式は次のとおりです。
{ $push: { <field1>: <value1>, ... } }
<field>
を埋め込みドキュメントまたは配列で指定するには、ドット表記を使用します。
動作
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
更新するドキュメントにフィールドがない場合、$push
は、値を要素として配列フィールドを追加します。
フィールドが配列でない場合、操作は失敗します。
値が配列の場合、 $push
は配列全体を単一の要素として追加します。値の各要素を個別に追加するには、$push
とともに$each
修飾子を使用します。例については、「複数のドキュメントの配列への値の追加」を参照してください。$push
で使用できる修飾子の一覧については、「修飾子」を参照してください。
MongoDB 5.0 以降、$push
などの更新演算子を空のオペランド式({ }
)と併用しても、mongod
でエラーが発生しなくなりました。空の更新を使用すると変更は一切されず、oplog エントリも作成されません(操作は実行されません)。
Modifiers
$push
演算子は、次の修飾子とともに使用できます。
修飾子とともに使用する場合、 $push
演算子は次の形式になります。
{ $push: { <field1>: { <modifier1>: <value1>, ... }, ... } }
修飾子を使用した $push
操作の処理では、修飾子の出現順序に関係なく、次の順序で実行されます。
配列を更新して、正しい位置に要素を追加します。
指定されている場合は、ソートします。
指定されている場合は、配列をスライスします。
配列を保存します。
例
students
コレクションを次のように作成します。
db.students.insertOne( { _id: 1, scores: [ 44, 78, 38, 80 ] } )
配列に対する値の追加
次の例では、89
を scores
配列に追加します。
db.students.updateOne( { _id: 1 }, { $push: { scores: 89 } } )
出力例:
{ _id: 1, scores: [ 44, 78, 38, 80, 89 ] }
複数のドキュメントの配列への値の追加
次のドキュメントを students
コレクションに追加します。
db.students.insertMany( [ { _id: 2, scores: [ 45, 78, 38, 80, 89 ] } , { _id: 3, scores: [ 46, 78, 38, 80, 89 ] } , { _id: 4, scores: [ 47, 78, 38, 80, 89 ] } ] )
次の $push
操作では、各ドキュメントの scores
配列に 95
を追加します。
db.students.updateMany( { }, { $push: { scores: 95 } } )
各 scores
配列に 95
が含まれていることを確認するには、次の操作を実行します。
db.students.find()
この操作は次の結果を返します。
[ { _id: 1, scores: [ 44, 78, 38, 80, 89, 95 ] }, { _id: 2, scores: [ 45, 78, 38, 80, 89, 95 ] }, { _id: 3, scores: [ 46, 78, 38, 80, 89, 95 ] }, { _id: 4, scores: [ 47, 78, 38, 80, 89, 95 ] } ]
配列に対する複数の値の追加
$push
を $each
修飾子と共に使用して、配列フィールドに複数の値を追加します。
次の例では、name
フィールドが joe
に等しいドキュメントの scores
配列に [ 90, 92, 85 ]
の各要素を追加します。
db.students.updateOne( { name: "joe" }, { $push: { scores: { $each: [ 90, 92, 85 ] } } } )
$push
複数の修飾子を持つ 演算子を使用する
次のドキュメントを students
コレクションに追加します。
db.students.insertOne( { "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] } )
次の $push
操作では以下を使用します。
quizzes
配列に複数のドキュメントを追加するための$each
修飾子、変更された
quizzes
配列のすべての要素をscore
フィールドで降順にソートするための$sort
修飾子、quizzes
配列の最初の 3 つのソートされた要素のみを保持するための$slice
修飾子。
db.students.updateOne( { _id: 5 }, { $push: { quizzes: { $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ], $sort: { score: -1 }, $slice: 3 } } } )
操作後、配列には最高得点の 3 つのクイズだけが残ります。
{ "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 5, "score" : 8 } ] }