$sortArray(集計)
定義
$sortArray
バージョン 5.2 で追加。
配列をその要素に基づいてソートします。ソート順はユーザー指定です。
$sortArray
の構文は次のとおりです。$sortArray: { input: <array>, sortBy: <sort spec> } フィールドタイプ説明input
式ソート対象となる配列。
式が次に該当する場合、結果は
null
になります:欠落と評価されます。
null
と評価されます。undefined
と評価されます。
式が配列以外の値に評価された場合、操作はエラーになります。
sortBy
ドキュメントまたはブール値ドキュメントではソート順を指定します。
動作
$sortArray
式は、sortBy
仕様に従って、input
配列の順序付けを行います。
$sortArray
の構文とセマンティクスは、 によって変更された$push
$sort
操作の動作と同じです。
ドキュメント フィールドでソート
配列要素がドキュメントの場合は、ドキュメント フィールドでソートすることができます。フィールド名とソート方向(昇順(1
)または降順(-1
))を指定します。
{ input: <array-of-documents>, sortBy: { <document-field>: <sort-direction> } }
値でソート
配列全体を値でソートするか、ドキュメントではない配列要素でソートするには、入力配列を識別し、sortBy
パラメーターで昇順ソートの場合は「1」を、降順ソートの場合は「-1」を指定します。
{ input: <array-of-documents>, sortBy: <sort-direction> }
Considerations
ソート安定性
ソートの安定性は指定されていません。ユーザーは、特定のソート アルゴリズムを使用するために $sortArray
に依存すべきではありません。
例
このセクションの$sortArray
の例は MongoDB 5.2以降で動作します。
team
コレクションを次のように作成します。
db.engineers.insertOne( { "team": [ { "name": "pat", "age": 30, "address": { "street": "12 Baker St", "city": "London" } }, { "name": "dallas", "age": 36, "address": { "street": "12 Cowper St", "city": "Palo Alto" } }, { "name": "charlie", "age": 42, "address": { "street": "12 French St", "city": "New Brunswick" } } ] } )
team
配列には 3 つの要素があります。team
の各要素には、ネストされたサブ要素 name
、 age
、および address
があります。次の例では、これらのサブ要素を使用して team
配列をソートする方法を説明しています。
フィールドでソート
配列要素内のフィールドをソートします。
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: "$team", sortBy: { name: 1 } } } } } ] )
name
フィールドは team
配列のサブ要素です。この操作は、次の結果を返します。
{ result: [ { name: 'charlie', age: 42, address: { street: '12 French St', city: 'New Brunswick' } }, { name: 'dallas', age: 36, address: { street: '12 Cowper St', city: 'Palo Alto' } }, { name: 'pat', age: 30, address: { street: '12 Baker St', city: 'London' } } ] }
サブフィールドでのソート
address
フィールドは、独自のサブフィールドを持つドキュメントです。ドット表記を使用して、サブフィールドに基づいて配列をソートする:
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: "$team", sortBy: { "address.city": -1 } } } } } ] )
sortBy
の値が「-1」であるため、ソート方向は降順になります。
{ result: [ { name: 'dallas', age: 36, address: { street: '12 Cowper St', city: 'Palo Alto' } }, { name: 'charlie', age: 42, address: { street: '12 French St', city: 'New Brunswick' } }, { name: 'pat', age: 30, address: { street: '12 Baker St', city: 'London' } } ] }
複数のフィールドでソート
複合ソートを実行するには、複数のインデックス フィールドを指定します。
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: "$team", sortBy: { age: -1, name: 1 } } } } } ] )
出力例:
{ name: 'charlie', age: 42, address: { street: '12 French St', city: 'New Brunswick' } }, { name: 'dallas', age: 36, address: { street: '12 Cowper St', city: 'Palo Alto' } }, { name: 'pat', age: 30, address: { street: '12 Baker St', city: 'London' } }
整数の配列をソートする
この例では、入力配列を直接指定しています。値はすべて同じ型(Int32)です。
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: [ 1, 4, 1, 6, 12, 5 ], sortBy: 1 } } } } ] )
出力例:
[ { result: [ 1, 1, 4, 5, 6, 12 ] } ]
入力配列の位置 0 と位置 2 には「1」があります。「1」は結果にまとめられていますが、「1」のグループが元の順序を基準にしてどのようにソートされるかは保証されません。
混合型フィールドでのソート
この例では、入力配列を直接指定しています。値にはさまざまな型があります。
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: [ 20, 4, { a: "Free" }, 6, 21, 5, "Gratis", { a: null }, { a: { sale: true, price: 19 } }, Decimal128( "10.23" ), { a: "On sale" } ], sortBy: 1 } } } } ] )
出力例:
{ result: [ 4, 5, 6, Decimal128("10.23"), 20, 21, 'Gratis', { a: null }, { a: 'Free' }, { a: 'On sale' }, { a: { sale: true, price: 19 } } ] }
結果は順番に並べられます。
対照的に、sortBy
フィールドをドキュメント フィールドの 1 つである sortBy: { a: 1 }
でソートするように変更すると、スカラー値と null
値のソート順序は未定義になります。
{ result: [ 20, 4, 6, 21, 5, 'Gratis', { a: null }, Decimal128("10.23"), { a: 'Free' }, { a: 'On sale' }, { a: { sale: true, price: 19 } } ] }