$slice
$slice
$slice
修飾子は、$push
操作中に配列要素の数を制限します。 読み取り操作から指定された数の配列要素をプロジェクションするか、または返すには、代わりに$slice
プロジェクション演算子を参照してください。$slice
修飾子を使用するには、$each
修飾子と一緒に使用する必要があります。空の配列[]
を$each
修飾子に渡すと、$slice
修飾子のみが効果を発揮します。{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $slice: <num> } } } <num>
は次のとおりです。値説明Zero配列<field>
を空の配列に更新します。負配列<field>
を更新して、最後の<num>
要素のみを含めるようにします。正の配列<field>
には最初の<num>
要素のみが含まれる配列を更新するには、
動作
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
修飾子が表示される順序は重要ではありません。 以前のバージョンでは、$each
と組み合わせて使用する場合、$slice
修飾子が最初の修飾子として表示される必要がありました。$push
で使用できる修飾子の一覧については、「修飾子 」を参照してください。
例
配列の末尾からのスライス
コレクションstudents
には、次のドキュメントが含まれています。
{ "_id" : 1, "scores" : [ 40, 50, 60 ] }
次の操作では、 scores
配列に新しい要素を追加し、 $slice
修飾子を使用して配列から最後の 5 つの要素を削除します。
db.students.updateOne( { _id: 1 }, { $push: { scores: { $each: [ 80, 78, 86 ], $slice: -5 } } } )
操作の結果は、更新されたscores
配列の要素を最後の 5 つの要素にスライスします。
{ "_id" : 1, "scores" : [ 50, 60, 80, 78, 86 ] }
配列の先頭からのスライス
コレクションstudents
には、次のドキュメントが含まれています。
{ "_id" : 2, "scores" : [ 89, 90 ] }
次の操作では、 scores
配列に新しい要素を追加し、 $slice
修飾子を使用して配列を最初の 3 つの要素に削除します。
db.students.updateOne( { _id: 2 }, { $push: { scores: { $each: [ 100, 20 ], $slice: 3 } } } )
操作の結果は、更新されたscores
配列の要素を最初の 3 つの要素にスライスします。
{ "_id" : 2, "scores" : [ 89, 90, 100 ] }
スライスのみを使用して配列を更新
コレクションstudents
には、次のドキュメントが含まれています。
{ "_id" : 3, "scores" : [ 89, 70, 100, 20 ] }
$slice
修飾子の効果のみでscores
フィールドを更新するには、スライスする要素の数を指定します(例: 次のように、 $slice
修飾子に対して-3
)を指定し、 $each
修飾子に対して空の配列[]
を指定します。
db.students.updateOne( { _id: 3 }, { $push: { scores: { $each: [ ], $slice: -3 } } } )
操作の結果は、 scores
配列の要素を最後の 3 つの要素にスライスすることです。
{ "_id" : 3, "scores" : [ 70, 100, 20 ] }
他の$slice
$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
修飾子、配列の 最初の 3
$slice
つのソートされた要素のみを保持するには、 修飾子を使用します。quizzes
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 } ] }
修飾子の順序は、修飾子が処理される順序には影響しません。 詳細については、「修飾子」を参照してください。