En MongoDB, el $cos
El operador de tubería de agregación devuelve el coseno de un valor que se mide en radianes.
$cos
acepta cualquier expresión válida que se resuelva en un número.
El $cos
El operador se introdujo en MongoDB 4.2.
Ejemplo
Supongamos que tenemos una colección llamada test
con el siguiente documento:
{ "_id" : 1, "data" : 3 }
Podemos usar el $cos
operador para devolver el coseno de los data
campo:
db.test.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
cosine: { $cos: "$data" }
}
}
]
)
Resultado:
{ "cosine" : -0.9899924966004454 }
Por defecto, el $cos
operador devuelve valores como un double
, pero también puede devolver valores como un decimal de 128 bits siempre que la expresión se resuelva en un valor decimal de 128 bits.
Cuando la Expresión está en Grados
Como se mencionó, $cos
acepta su expresión en radianes. Puede usar el $degreesToRadians
operador para convertir cualquier valor de grados a radianes.
Ejemplo:
db.test.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
cosine: { $degreesToRadians: { $cos: "$data" } }
}
}
]
)
Resultado:
{ "cosine" : -0.017278628635716543 }
Valores nulos
Los valores nulos devuelven null
cuando se usa $cos
operador.
Supongamos que agregamos el siguiente documento a nuestra colección:
{ "_id" : 3, "data" : null }
Ejecutemos el $cos
operador contra ese documento:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
cosine: { $cos: "$data" }
}
}
]
)
Resultado:
{ "cosine" : null }
Podemos ver que el resultado es null
.
Valores NaN
Si el argumento se resuelve en NaN
, $cos
devuelve NaN
.
Ejemplo:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
cosine: { $cos: 1 * "string" }
}
}
]
)
Resultado:
{ "cosine" : NaN }
En este caso, intenté multiplicar un número por una cadena, lo que resultó en NaN
siendo devuelto.
Infinito
Si el argumento se resuelve en Infinity
o -Infinity
, el $cos
operador devuelve un error.
Supongamos que agregamos el siguiente documento a nuestra colección:
{ "_id" : 4, "data" : Infinity }
Ejecutemos $cos
contra el campo de datos:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
cosine: { $cos: "$data" }
}
}
]
)
Resultado:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "cannot apply $cos to inf, value must in (-inf,inf)", "code" : 50989, "codeName" : "Location50989" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Ese es el error que me sale en mongo
concha.
Campos Inexistentes
Si el $cos
el operador se aplica a un campo que no existe, null
es devuelto.
Ejemplo:
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
cosine: { $cos: "$carrots" }
}
}
]
)
Resultado:
{ "cosine" : null }
Decimal de 128 bits
Como se mencionó, si la expresión proporcionada a $cos
es decimal de 128 bits, entonces el resultado se devuelve en decimal de 128 bits.
Supongamos que agregamos el siguiente documento a la colección:
{ "_id" : 5, "data" : NumberDecimal("1.1301023541559787031443874490659") }
Esto es lo que sucede cuando lo ejecutamos a través de $cos
operador:
db.test.aggregate(
[
{ $match: { _id: 5 } },
{ $project: {
_id: 0,
cosine: { $cos: "$data" }
}
}
]
)
Resultado:
{ "cosine" : NumberDecimal("0.4265672353490945266548815934449746") }
La salida es decimal de 128 bits.