$sort
$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 } ] }
クエリ内の修飾子の順序によって、修飾子が適用される順序は変わりません。詳細については、「修飾子」を参照してください。