sql >> データベース >  >> NoSQL >> MongoDB

MongoDB$minアグリゲーションパイプラインオペレーター

    MongoDBでは、$min 集計パイプライン演算子は、式から最小値を返します。

    構文

    $min 演算子は2つの構文をサポートします。

    構文1:

    { $min: <expression> }

    構文2:

    { $min: [ <expression1>, <expression2> ... ]  }

    最初の構文は1つの引数を受け入れ、2番目の構文は複数の引数を受け入れます。

    $groupで使用する場合 ステージでは、最初の構文のみを使用できます。この場合、$min 同じgroupbyキーを共有するドキュメントのグループ内の各ドキュメントに式を適用した結果の最小値を返します。

    構文1の例(単一引数)

    単一引数の構文を使用するいくつかの例を次に示します。

    グループ化されたドキュメント

    この例では、$minを使用しています $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でグループ化できます フィールドをクリックし、$minを使用します weightの最小値を返します 各グループのフィールド:

    db.pets.aggregate(
       [
         {
           $group:
              {
                _id: "$type",
                min: { $min: "$weight" }
              }
         }
       ]
    )

    結果:

    { "_id" : "Kangaroo", "min" : 100 }
    { "_id" : "Dog", "min" : 10 }
    { "_id" : "Cat", "min" : 7 }

    配列

    この例では、$minを適用します 値の配列を持つフィールドを含む単一のドキュメントに。

    このオプションは、単一引数構文を使用する場合にのみ使用できます。マルチ引数構文を使用する場合、配列は無視されます(これについては以下で詳しく説明します)。

    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" }

    $minを適用できます scoresに 各ドキュメントのフィールド:

    db.players.aggregate(
       [
         {
           $project:
              {
                player: 1,
                min: { $min: "$scores" }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "player" : "Homer", "min" : 1 }
    { "_id" : 2, "player" : "Marge", "min" : 0 }
    { "_id" : 3, "player" : "Bart", "min" : 0 }
    { "_id" : 4, "player" : "Brian", "min" : 7 }
    { "_id" : 5, "player" : "Farnsworth", "min" : null }
    { "_id" : 6, "player" : "Meg", "min" : null }
    { "_id" : 7, "player" : "Ron", "min" : null }

    この場合、最初の4つのドキュメントは、それぞれの配列にあるさまざまな数値から最小値を返しました。

    ドキュメント4の場合、配列には1つの番号しかなかったため、これは番号と同じでした。

    ドキュメント5がnullを返しました 空の配列を提供したためです。

    ドキュメント6がnullを返しました nullを提供したため 引数として。

    ドキュメント7がnullを返しました フィールドさえ存在しなかったからです。

    構文2の例(複数の引数)

    2番目の構文には、$minの提供が含まれます。 複数の引数があります。 $min 次に、指定されたすべての引数から最小値を返します。

    dataというコレクションがあるとします。 次のドキュメントで:

    { "_id" : 1, "a" : 10, "b" : 500, "c" : -900, "d" : 4 }

    $minを使用できます aから最小値を返す 、bc 、およびd フィールド:

    db.data.aggregate(
       [
         { $match: { _id: { $in: [ 1 ] } } },
         {
           $project:
              {
                min: { $min: [ "$a", "$b", "$c", "$d" ] }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "min" : -900 }

    この場合、-900 最小値でした。

    欠落しているフィールド

    複数引数の構文を使用する場合は、$min 欠落しているフィールドはすべて無視されます。つまり、存在しないフィールドを指定すると、それは無視されます。フィールドが存在しない場合は、nullを返します。 。

    例:

    db.data.aggregate(
       [
         { $match: { _id: { $in: [ 1 ] } } },
         {
           $project:
              {
                min: { $min: [ "$a", "$b", "$c", "$d", "$e" ] }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "min" : -900 }

    この場合、追加のフィールド($e)を提供しました )ドキュメントに存在しません。 $min 実行する残りのフィールドに基づいて最小値を計算しました 存在します。

    ただし、なしの場合は次のようになります 存在するフィールドの数:

    db.data.aggregate(
       [
         { $match: { _id: { $in: [ 1 ] } } },
         {
           $project:
              {
                result: { $min: [ "$x", "$y", "$z" ] }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "result" : null }

    結果はnullです 。

    前に見たように、単一引数の構文を使用する場合、フィールドが欠落していると、nullになります。 。

    例:

    db.pets.aggregate(
       [
         {
           $group:
              {
                _id: "$type",
                min: { $min: "$oops!" }
              }
         }
       ]
    )

    結果:

    { "_id" : "Dog", "min" : null }
    { "_id" : "Cat", "min" : null }
    { "_id" : "Kangaroo", "min" : null }

    異なるタイプの比較

    $min 演算子は値とタイプの両方を比較します。値のタイプが異なる場合は、$min BSONの比較順序に基づいて最小値を計算します。

    コレクションに次のドキュメントが含まれているとします。

    { "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 0 ] }
    { "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "0" }
    { "_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つのフィールドすべてで文字列を使用しています。

    $minを適用すると次のようになります それらのドキュメントへ:

    db.data.aggregate(
       [
         { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } },
         {
           $project:
              {
                min: { $min: [ "$a", "$b", "$c", "$d" ] }
              }
         }
       ]
    )

    結果:

    { "_id" : 2, "min" : 1 }
    { "_id" : 3, "min" : 1 }
    { "_id" : 4, "min" : "Four" }
    { "_id" : 5, "min" : ISODate("1999-01-03T23:30:15.100Z") }
    { "_id" : 6, "min" : "2000-01-03T23:30:15.100Z" }

    _idのドキュメントについて 2の 、数値は配列よりも小さいため、数値1 が返されます(配列に他のすべての数値よりも少ない数値が含まれている場合でも)。

    ドキュメント3:数値は文字列よりも小さいため、最小の数値が返されます。

    ドキュメント4:すべてのフィールドは文字列であるため、Four は最小の文字列です。

    ドキュメント5:2つの日付が指定されているため、前の日付が返されます。

    ドキュメント6:この場合、Dateオブジェクトと日付文字列が提供されます。文字列はDateオブジェクトよりも小さいため、文字列が返されます(日付がDateオブジェクトより後であっても)。

    利用可能なステージ

    $min 次の段階で利用できます:

    • $group
    • $project
    • $addFields
    • $set
    • $replaceRoot
    • $replaceWith
    • $match $exprを含むステージ 表現

    1. Python ReddisキューValueError:__main__モジュールの関数をワーカーで処理できません

    2. なぜmongoDBはobjectIDを使用するのですか?

    3. Laravelの外部からLaravelキューにプッシュする(NodeJS)

    4. なぜ必要なのか、マングースを使用する利点は何ですか