Dans MongoDB, le $asin
L'opérateur de pipeline d'agrégation renvoie l'arcsinus (sinus inverse) d'une valeur, mesurée en radians.
$asin
accepte toute expression valide qui se résout en un nombre compris entre -1
et 1
.
Le $asin
L'opérateur a été introduit dans MongoDB 4.2.
Exemple
Supposons que nous ayons une collection appelée test
avec le document suivant :
{ "_id" : 1, "data" : 0.5 }
Nous pouvons utiliser le $asin
opérateur pour renvoyer l'arccosinus de la data
champ :
db.test.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
arcsine: { $asin: "$data" }
}
}
]
)
Résultat :
{ "arcsine" : 0.5235987755982988 }
Par défaut, le $asin
l'opérateur renvoie les valeurs sous la forme d'un double
, mais il peut également renvoyer des valeurs sous la forme d'un décimal de 128 bits tant que l'expression se résout en une valeur décimale de 128 bits.
Convertir en degrés
Comme mentionné, $asin
renvoie son résultat en radians. Vous pouvez utiliser le $radiansToDegrees
opérateur si vous voulez le résultat en degrés.
Exemple :
db.test.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
radians: { $asin: "$data" },
degrees: { $radiansToDegrees: { $asin: "$data" } }
}
}
]
)
Résultat :
{ "radians" : 0.5235987755982988, "degrees" : 29.999999999999996 }
Dans cet exemple, le premier champ présente le résultat en radians et le second le présente en degrés.
Valeurs décimales 128 bits
Si l'expression fournie à $asin
est décimal 128 bits, le résultat est renvoyé en décimal 128 bits.
Supposons que nous ajoutions le document suivant à notre collection :
{ "_id" : 2, "data" : NumberDecimal("0.1301023541559787031443874490659") }
Exécutons le $asin
opérateur sur ce document :
db.test.aggregate(
[
{ $match: { _id: 2 } },
{ $project: {
_id: 0,
arcsine: { $asin: "$data" }
}
}
]
)
Résultat :
{ "arcsine" : NumberDecimal("0.1304722105697547116336288178856500") }
La sortie est décimale 128 bits.
Valeurs nulles
Les valeurs nulles renvoient null
lors de l'utilisation du $asin
opérateur.
Supposons que nous ajoutions le document suivant à notre collection :
{ "_id" : 3, "data" : null }
Exécutons le $asin
opérateur sur ce document :
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
arcsine: { $asin: "$data" }
}
}
]
)
Résultat :
{ "arcsine" : null }
Nous pouvons voir que le résultat est null
.
Valeurs NaN
Si l'argument se résout en NaN
, $asin
renvoie NaN
.
Exemple :
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
arcsine: { $asin: 1 * "String" }
}
}
]
)
Résultat :
{ "arcsine" : NaN }
Dans ce cas, l'expression a tenté de multiplier un nombre par une chaîne, ce qui a donné NaN
être retourné.
Infini
Si l'argument se résout en Infinity
ou -Infinity
, le $asin
l'opérateur renvoie une erreur.
Supposons que nous ajoutions le document suivant à notre collection :
{ "_id" : 4, "data" : Infinity }
Lançons $asin
contre le champ de données :
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
arcsine: { $asin: "$data" }
}
}
]
)
Résultat :
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "cannot apply $asin to inf, value must in [-1,1]", "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
C'est l'erreur que j'obtiens dans le mongo
shell lors de l'exécution de ce code.
Champs inexistants
Si le $asin
l'opérateur est appliqué sur un champ qui n'existe pas, null
est renvoyé.
Exemple :
db.test.aggregate(
[
{ $match: { _id: 4 } },
{ $project: {
_id: 0,
arcsine: { $asin: "$wrong" }
}
}
]
)
Résultat :
{ "arcsine" : null }
Valeurs hors plage
Fournir une valeur hors plage à $asin
entraînera une erreur. Nous avons déjà vu ce qui se passe lorsque nous fournissons Infinity
à $asin
. Utilisons maintenant une valeur plus terre à terre, comme, par exemple, 2
.
Supposons que nous ajoutions le document suivant à la collection :
{ "_id" : 5, "data" : 2 }
Exécutons maintenant $asin
par rapport aux data
champ :
db.test.aggregate(
[
{ $match: { _id: 5 } },
{ $project: {
_id: 0,
arcsine: { $asin: "$data" }
}
}
]
)
Résultat :
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "cannot apply $asin to 2, value must in [-1,1]", "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
Comme l'indique le message d'erreur, la valeur doit être comprise entre -1
et 1
.