MongoDBでは、$max
集計パイプライン演算子は、式から最大値を返します。
構文
$max
演算子は2つの構文をサポートします。
構文1:
{ $max: <expression> }
構文2:
{ $max: [ <expression1>, <expression2> ... ] }
最初の構文は1つの引数を受け入れ、2番目の構文は複数の引数を受け入れます。
$group
で使用する場合 ステージでは、最初の構文のみを使用できます。この場合、$max
同じgroupbyキーを共有するドキュメントのグループ内の各ドキュメントに式を適用した結果の最大値を返します。
構文1の例(単一引数)
単一引数の構文を使用するいくつかの例を次に示します。
グループ化されたドキュメント
この例では、$max
を使用しています $group
と組み合わせて キーでグループ化されたドキュメントのグループから最大値を返します。
pets
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
これらのドキュメントをtype
でグループ化できます フィールドをクリックし、$max
を使用します weight
の最大値を返します 各グループのフィールド:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
max: { $max: "$weight" }
}
}
]
)
結果:
{ "_id" : "Kangaroo", "max" : 200 } { "_id" : "Cat", "max" : 12 } { "_id" : "Dog", "max" : 30 }
配列
この例では、$max
を適用します 値の配列を持つフィールドを含む単一のドキュメントに。
このオプションは、単一引数構文を使用する場合にのみ使用できます。マルチ引数構文を使用する場合、配列は無視されます(これについては以下で詳しく説明します)。
players
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] } { "_id" : 4, "player" : "Brian", "scores" : [ 7 ] } { "_id" : 5, "player" : "Farnsworth", "scores" : [ ] } { "_id" : 6, "player" : "Meg", "scores" : null } { "_id" : 7, "player" : "Ron" }
$max
を適用できます scores
に 各ドキュメントのフィールド:
db.players.aggregate(
[
{
$project:
{
player: 1,
max: { $max: "$scores" }
}
}
]
)
結果:
{ "_id" : 1, "player" : "Homer", "max" : 8 } { "_id" : 2, "player" : "Marge", "max" : 18 } { "_id" : 3, "player" : "Bart", "max" : 15 } { "_id" : 4, "player" : "Brian", "max" : 7 } { "_id" : 5, "player" : "Farnsworth", "max" : null } { "_id" : 6, "player" : "Meg", "max" : null } { "_id" : 7, "player" : "Ron", "max" : null }
この場合、最初の4つのドキュメントは、それぞれの配列にあるさまざまな数値から最大値を返しました。
ドキュメント4の場合、配列には1つの番号しかなかったため、これは番号と同じでした。
ドキュメント5がnull
を返しました 空の配列を提供したためです。
ドキュメント6がnull
を返しました null
を提供したため 引数として。
ドキュメント7がnull
を返しました フィールドさえ存在しなかったからです。
構文2の例(複数の引数)
2番目の構文には、$max
の提供が含まれます。 複数の引数があります。 $max
次に、指定されたすべての引数から最大値を返します。
data
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "a" : 10, "b" : 500, "c" : -900, "d" : 4 }
$max
を使用できます a
から最大値を返す 、b
、c
、およびd
フィールド:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
max: { $max: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
結果:
{ "_id" : 1, "max" : 500 }
この場合、500
最大値でした。
欠落しているフィールド
マルチ引数構文を使用する場合、$max
欠落しているフィールドはすべて無視されます。つまり、存在しないフィールドを指定すると、それは無視されます。フィールドが存在しない場合は、null
を返します。 。
例:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
結果:
{ "_id" : 1, "max" : 500 }
この場合、追加のフィールド($e
)を提供しました )ドキュメントに存在しません。 $max
実行する残りのフィールドに基づいて最大値を計算しました 存在します。
ただし、なしの場合は次のようになります 存在するフィールドの数:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
result: { $max: [ "$x", "$y", "$z" ] }
}
}
]
)
結果:
{ "_id" : 1, "result" : null }
結果はnull
です 。
前に見たように、単一引数の構文を使用する場合、フィールドが欠落していると、null
になります。 。
例:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
max: { $max: "$oops!" }
}
}
]
)
結果:
{ "_id" : "Dog", "max" : null } { "_id" : "Kangaroo", "max" : null } { "_id" : "Cat", "max" : null }
異なるタイプの比較
$max
演算子は値とタイプの両方を比較します。値が異なるタイプの場合、$max
BSONの比較順序に基づいて最大値を計算します。
コレクションに次のドキュメントが含まれているとします。
{ "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 1 ] } { "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "1" } { "_id" : 4, "a" : "One", "b" : "Two", "c" : "Three", "d" : "Four" } { "_id" : 5, "a" : ISODate("1999-01-03T23:30:15.100Z"), "b" : ISODate("2000-01-03T23:30:15.100Z") } { "_id" : 6, "a" : ISODate("1999-01-03T23:30:15.100Z"), "b" : "2000-01-03T23:30:15.100Z" }
ドキュメント4を除いて、これらの各ドキュメントは混合タイプを使用します(データフィールド全体で他のタイプとは異なるタイプが少なくとも1つあります)。ドキュメント4は、4つのフィールドすべてで文字列を使用しています。
$max
を適用すると次のようになります それらのドキュメントへ:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } },
{
$project:
{
max: { $max: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
結果:
{ "_id" : 2, "max" : [ 1 ] } { "_id" : 3, "max" : "1" } { "_id" : 4, "max" : "Two" } { "_id" : 5, "max" : ISODate("2000-01-03T23:30:15.100Z") } { "_id" : 6, "max" : ISODate("1999-01-03T23:30:15.100Z") }
_id
のドキュメント 2
の 、配列は数値よりも大きいため、配列が返されます(その要素が他の数値よりも小さい数値であっても)。
ドキュメント3:文字列は数値よりも大きいため、文字列が返されます。
ドキュメント4:すべてのフィールドは文字列であるため、Two
最大の文字列です。
ドキュメント5:2つの日付が指定されているため、後の日付が返されます。
ドキュメント6:この場合、Dateオブジェクトと日付文字列が提供されます。 Dateオブジェクトは文字列よりも大きいため、Dateオブジェクトが返されます(日付が文字列よりも前であっても)。
利用可能なステージ
$max
次の段階で利用できます:
-
$group
-
$project
-
$addFields
-
$set
-
$replaceRoot
-
$replaceWith
-
$match
$expr
を含むステージ 表現