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

$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>
}
  • ソート キーには暗黙的な配列トラバーサルはありません。

  • 定位置演算子はサポートされていません。「values.1」のようなフィールド名は、values 配列の「1」と呼ばれるサブフィールドを表します。values 配列のインデックス1にある項目は参照しません。

  • 配列全体がソートされる場合、辞書式で表示されます。集計 $sort ステージの動作は異なります。詳細については$sortを参照してください。

  • 配列がフィールドによってソートされる場合、指定されたフィールドを持たないドキュメントまたはスカラーは均等にソートされます。結果のソート順は未定義です。

  • null 値と欠損値は等しくソートされます。

ソートの安定性は指定されていません。ユーザーは、特定のソート アルゴリズムを使用するために $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 の各要素には、ネストされたサブ要素 nameage、および 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 } }
] }

戻る

$slice

項目一覧