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

MongoDB $ stdDevSamp

    MongoDBでは、$stdDevSamp 集計パイプラインオペレーターは、入力値のサンプル標準偏差を計算します。

    入力値は、ドキュメントのグループ(つまり、同じキーでグループ化されたドキュメント)からのものにすることも、単一のドキュメント内の複数のフィールドにすることもできます。

    $stdDevSamp $stdDevPopに似ています 。違いは、$stdDevSamp サンプルを計算します 標準偏差、$stdDevPop 人口を計算します 標準偏差。

    したがって、$stdDevSampを使用してください 値に、母集団について一般化するデータの母集団のサンプルが含まれている場合。値がデータの母集団全体を表す場合、またはより大きな母集団について一般化したくない場合は、$stdDevPopを使用します。 代わりに。

    構文

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

    構文1:

    { $stdDevSamp: <expression> }

    構文2:

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

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

    $groupで使用する場合 ステージでは、最初の構文のみを使用できます。この場合、$stdDevSamp 同じgroupbyキーを共有するドキュメントのグループについて、指定された式のサンプル標準偏差を返します。

    構文1の例(単一引数)

    構文1を使用する例をいくつか示します。

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

    この例では、$stdDevSampを使用しています $groupと組み合わせて キーでグループ化されたドキュメントのグループ全体のサンプル標準偏差を返します。

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

    { "_id" : 1, "ticker" : "gme", "price" : 10 }
    { "_id" : 2, "ticker" : "gme", "price" : 40 }
    { "_id" : 3, "ticker" : "gme", "price" : 90 }
    { "_id" : 4, "ticker" : "gme", "price" : 180 }
    { "_id" : 5, "ticker" : "gme", "price" : 290 }
    { "_id" : 6, "ticker" : "gme", "price" : 390 }
    { "_id" : 7, "ticker" : "gme", "price" : 190 }
    { "_id" : 8, "ticker" : "gme", "price" : 90 }
    { "_id" : 9, "ticker" : "gme", "price" : 10 }
    { "_id" : 10, "ticker" : "jnj", "price" : 131 }
    { "_id" : 11, "ticker" : "jnj", "price" : 133 }
    { "_id" : 12, "ticker" : "jnj", "price" : 138 }
    { "_id" : 13, "ticker" : "jnj", "price" : 141 }
    { "_id" : 14, "ticker" : "jnj", "price" : 145 }
    { "_id" : 15, "ticker" : "jnj", "price" : 150 }
    { "_id" : 16, "ticker" : "jnj", "price" : 154 }
    { "_id" : 17, "ticker" : "jnj", "price" : 156 }
    { "_id" : 18, "ticker" : "jnj", "price" : 160 }

    これらのドキュメントをtickerでグループ化できます フィールドをクリックし、$stdDevSampを使用します priceのサンプル標準偏差を返す 各グループのフィールド:

    db.stonks.aggregate(
       [
         {
           $group:
              {
                _id: "$ticker",
                result: { $stdDevSamp: "$price" }
              }
         }
       ]
    )

    結果:

    { "_id" : "gme", "result" : 131.24404748406687 }
    { "_id" : "jnj", "result" : 10.344080432788612 }

    そのgmeを見ることができます jnjよりもはるかに高いサンプル標準偏差があります 。

    配列

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

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

    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 }

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

    db.players.aggregate(
       [
         {
           $project:
              {
                result: { $stdDevSamp: "$scores" }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "result" : 3.0783421635988546 }
    { "_id" : 2, "result" : 7.633260552782583 }
    { "_id" : 3, "result" : 5.988878581726855 }
    { "_id" : 4, "result" : null }
    { "_id" : 5, "result" : null }
    { "_id" : 6, "result" : null }

    この場合、最初の3つのドキュメントは、それぞれの配列にあるさまざまな数値のサンプル標準偏差を返しました。

    ドキュメント4の結果、nullの標準偏差が発生しました 。これは、配列に1つの数値しか指定していないためです。 $stdDevPopを使用した場合 、これは0を返します 。

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

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

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

    2番目の構文には、$stdDevSampの提供が含まれます。 複数の引数があります。 $stdDevSamp 次に、提供されたすべての引数に基づいて標準偏差を計算します。

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

    { "_id" : 1, "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
    { "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 4 ] }
    { "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "Hey" }

    $stdDevSampを使用できます aのサンプル標準偏差を返す 、bc 、およびd 各ドキュメントのフィールド:

    db.data.aggregate(
       [
         {
           $project:
              {
                result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "result" : 1.2909944487358056 }
    { "_id" : 2, "result" : 1 }
    { "_id" : 3, "result" : 1 }

    最初のドキュメントの結果は、1の入力値に基づいています 、23 、および4

    ただし、最後の2つのドキュメントの結果は1のみでした。 、2 、および3 評価されています。 $stdDevSamp オペレーターはdを無視しました 田畑。

    $stdDevSamp 数値以外の値を無視します。したがって、この場合は"Hey"を無視しました ドキュメント3で、残りの(数値)フィールドからのサンプル標準偏差を計算しました。

    ドキュメント2については、そのd フィールドに配列が含まれています。前述のように、$stdDevSamp マルチ引数構文を使用する場合、演算子は配列を無視します。より正確には、このコンテキストで使用される場合、配列は非数値として扱われます。そして、前述のように、$stdDevSamp 数値以外の値を無視します。

    すべての値が数値以外の場合、$stdDevSamp nullを返します 。

    欠落しているフィールド

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

    例:

    db.data.aggregate(
       [
         {
           $project:
              {
                result: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
              }
         }
       ]
    )

    結果:

    { "_id" : 1, "result" : 1.2909944487358056 }
    { "_id" : 2, "result" : 1 }
    { "_id" : 3, "result" : 1 }

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

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

    db.data.aggregate(
       [
         {
           $project:
              {
                result: { $stdDevSamp: [ "$x", "$y", "$z" ] }
              }
         }
       ]
    )

    結果:

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

    結果はnullです すべてのドキュメントに対して。

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

    例:

    db.stonks.aggregate(
       [
         {
           $group:
              {
                _id: "$ticker",
                result: { $stdDevSamp: "$oops!" }
              }
         }
       ]
    )

    結果:

    { "_id" : "gme", "result" : null }
    { "_id" : "jnj", "result" : null }

    利用可能なステージ

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

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

    1. phpRedisのクラスターへの移行とコンシステントハッシュ

    2. Golangmgoを使用したMongoDBAtlasへの接続:レプリカセットに到達可能なサーバーが永続的ではありません

    3. mongo-サーバー127.0.0.1:27017に接続できませんでした

    4. MongoDB $literal