sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $stdDevSamp

En MongoDB, el $stdDevSamp El operador de tubería de agregación calcula la desviación estándar de la muestra de los valores de entrada.

Los valores de entrada pueden ser de un grupo de documentos (es decir, documentos que están agrupados por la misma clave), o pueden ser varios campos dentro de un solo documento.

$stdDevSamp es similar a $stdDevPop . La diferencia es que $stdDevSamp calcula la muestra desviación estándar, mientras que $stdDevPop calcula la población desviación estándar.

Por lo tanto, use $stdDevSamp si sus valores abarcan una muestra de una población de datos a partir de la cual generalizar sobre la población. Si los valores representan toda la población de datos o no desea generalizar sobre una población mayor, use $stdDevPop en su lugar.

Sintaxis

El $stdDevSamp operador admite dos sintaxis.

Sintaxis 1:

{ $stdDevSamp: <expression> }

Sintaxis 2:

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

La primera sintaxis acepta un argumento y la segunda sintaxis acepta múltiples argumentos.

Cuando se usa en el $group etapa, solo puede usar la primera sintaxis. En este caso, $stdDevSamp devuelve la desviación estándar de muestra de la expresión especificada para un grupo de documentos que comparten el mismo grupo por clave.

Ejemplos de sintaxis 1 (argumento único)

Aquí hay un par de ejemplos que usan la sintaxis 1.

Documentos agrupados

Este ejemplo usa $stdDevSamp junto con $group para devolver la desviación estándar de la muestra en un grupo de documentos que están agrupados por clave.

Supongamos que tenemos una colección llamada stonks con los siguientes documentos:

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

Podemos agrupar estos documentos por su ticker y luego use $stdDevSamp para devolver la desviación estándar de la muestra del price campo para cada grupo:

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

Resultado:

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

Podemos ver que gme tiene una desviación estándar de muestra mucho más alta que jnj .

Arreglos

Este ejemplo aplica $stdDevSamp a un solo documento que contiene un campo con una matriz de valores.

Esta opción solo está disponible cuando se utiliza la sintaxis de argumento único. Las matrices se ignoran cuando se usa la sintaxis de múltiples argumentos (más sobre esto a continuación).

Supongamos que tenemos una colección llamada players con los siguientes documentos:

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

Podemos aplicar $stdDevSamp a las scores campo en cada documento:

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

Resultado:

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

En este caso, los primeros tres documentos devolvieron la desviación estándar de la muestra para los diversos números que estaban en sus respectivas matrices.

El documento 4 dio como resultado una desviación estándar de null . Esto se debe a que solo proporcionamos un número en la matriz. Si hubiéramos usado $stdDevPop , esto habría devuelto 0 .

El documento 5 devolvió null porque proporcionamos una matriz vacía.

El documento 6 devolvió null porque proporcionamos null como argumento.

Ejemplo de sintaxis 2 (múltiples argumentos)

La segunda sintaxis consiste en proporcionar $stdDevSamp con más de un argumento. $stdDevSamp luego calcula la desviación estándar en función de todos los argumentos proporcionados.

Supongamos que tenemos una colección llamada data con los siguientes documentos:

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

Podemos usar $stdDevSamp para devolver la desviación estándar de la muestra del a , b , c y d campos de cada documento:

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

Resultado:

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

El resultado del primer documento se basa en los valores de entrada de 1 , 2 , 3 y 4 .

Sin embargo, los dos últimos documentos dieron como resultado solo 1 , 2 y 3 siendo evaluado. El $stdDevSamp el operador ignoró su d los campos.

El $stdDevSamp ignora los valores no numéricos. Entonces, en este caso, ignoró "Hey" en el documento 3 y calculó la desviación estándar de la muestra de los campos (numéricos) restantes.

En cuanto al documento 2, es d campo contiene una matriz. Como se mencionó, el $stdDevSamp El operador ignora las matrices cuando usa la sintaxis de múltiples argumentos. Más precisamente, trata las matrices como valores no numéricos cuando se usa en este contexto. Y como se mencionó, $stdDevSamp ignora los valores no numéricos.

Si todos los valores no son numéricos, entonces $stdDevSamp devuelve null .

Campos faltantes

Al usar la sintaxis de varios argumentos, $stdDevSamp ignora cualquier campo faltante. Es decir, si proporciona un campo que no existe, lo ignora. Si ninguno de los campos existe, devuelve null .

Ejemplo:

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

Resultado:

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

En este caso proporcioné un campo extra ($e ) que no existe en el documento. $stdDevSamp calculó la desviación estándar de la muestra en función de los campos restantes que hacen existir.

Sin embargo, esto es lo que sucede cuando ninguno de los campos existen:

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

Resultado:

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

El resultado es null para todos los documentos.

Cuando se usa la sintaxis de argumento único, un campo faltante da como resultado null .

Ejemplo:

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

Resultado:

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

Etapas disponibles

$stdDevSamp está disponible en las siguientes etapas:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match etapa que incluye un $expr expresión