$sort$sort修飾子は、$push操作中に配列の要素を順序付けます。$sort修飾子を使用するには、$each修飾子と一緒に使用する必要があります。空の配列[]を$each修飾子に渡すと、$sort修飾子のみが効果を発揮します。{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $sort: <sort specification> } } } <sort specification>の場合:ドキュメントではない配列要素をソートしたり、配列要素がドキュメントである場合にドキュメント全体でソートしたりするには、昇順の場合は
1を指定し、降順の場合は-1を指定します。配列要素がドキュメントの場合、ドキュメント内のフィールドでソートするには、フィールドと方向を含むソートドキュメント、つまり
{ field: 1 }または{ field: -1 }を指定します。ソート仕様に含まれる配列フィールドを参照しないでください (例:{ "arrayField.field": 1 }は誤りです)。
動作
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
$sort 修飾子により、ドキュメント以外の配列要素もソートできます。以前のバージョンでは、$sort 修飾子によりソートする配列要素は、ドキュメントのみである必要がありました。
ドキュメントが配列要素である場合、ドキュメント全体またはドキュメント内の特定のフィールドをこの修飾子でソートできます。以前のバージョンでは、$sort 修飾子のソート対象は、ドキュメント内の特定のフィールドのみでした。
$sort修飾子なしで$each 修飾子を使用しようとすると、エラーが発生します。$sortには$slice修飾子が不要になりました。 $pushで使用できる修飾子の一覧については、「修飾子 」を参照してください。
例
ドキュメントの配列をドキュメント内のフィールドで並べ替える
students コレクションを次のように作成します。
db.students.insertOne( { "_id": 1, "quizzes": [ { "id" : 1, "score" : 6 }, { "id" : 2, "score" : 9 } ] } )
次のアップデートでは、quizzes 配列にドキュメントを追加し、配列のすべての要素を score フィールドの昇順でソートします。
db.students.updateOne( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ], $sort: { score: 1 } } } } )
重要
ソートドキュメントはドキュメント内のフィールドを直接参照し、含まれている配列フィールド quizzes は参照しません。つまり { score: 1 } であり、 { "quizzes.score": 1} ではありません。
更新後、配列要素は score フィールドの昇順になります。
{ "_id" : 1, "quizzes" : [ { "id" : 1, "score" : 6 }, { "id" : 5, "score" : 6 }, { "id" : 4, "score" : 7 }, { "id" : 3, "score" : 8 }, { "id" : 2, "score" : 9 } ] }
ドキュメントではない配列要素を並べ替える
次のドキュメントを students コレクションに追加します。
db.students.insertOne( { "_id" : 2, "tests" : [ 89, 70, 89, 50 ] } )
次の操作は、tests 配列にさらに 2 つの要素を追加し、要素を並べ替えます。
db.students.updateOne( { _id: 2 }, { $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } } )
更新されたドキュメントには、tests 配列の要素が昇順で含まれています。
{ "_id" : 2, "tests" : [ 40, 50, 60, 70, 89, 89 ] }
ソートのみを使用して配列を更新
次のドキュメントを students コレクションに追加します。
db.students.insertOne( { "_id" : 3, "tests" : [ 89, 70, 100, 20 ] } )
tests フィールドを更新してその要素を降順で並べ替えるには、{ $sort: -1 } を指定し、$each 修飾子に空の配列 [] を指定します。以下に例を挙げます。
db.students.updateOne( { _id: 3 }, { $push: { tests: { $each: [ ], $sort: -1 } } } )
この例では、tests フィールドの値を降順でソートします。
{ "_id" : 3, "tests" : [ 100, 89, 70, 20 ] }
他の$sort $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修飾子、$sortモディファイア:quizzes配列のすべての要素をscoreフィールドで 降順にソートします。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 } ] }
クエリ内の修飾子の順序によって、修飾子が適用される順序は変わりません。詳細については、「修飾子」を参照してください。