Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

$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 ] }

次のドキュメントを 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 }
]
}

クエリ内の修飾子の順序によって、修飾子が適用される順序は変わりません。詳細については、「修飾子」を参照してください。

戻る

$slice

項目一覧