In MongoDB, il $atan2
l'operatore della pipeline di aggregazione restituisce l'arcotangente (tangente inversa) di un valore diviso per un altro.
Fornisci i due valori in una matrice. Ognuno dei due valori forniti a $atan2
può essere qualsiasi espressione valida che si risolve in un numero.
Il valore restituito è in radianti.
Il $atan2
operatore è stato introdotto in MongoDB 4.2.
Esempio
Supponiamo di avere una raccolta chiamata data
con il seguente documento:
{ "_id" : 1, "a" : 2, "b" : 3 }
Possiamo usare il $atan2
operatore per restituire l'arcotangente di a
campo diviso per il b
campo:
db.data.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
arctangent: { $atan2: [ "$a", "$b" ] }
}
}
]
)
Risultato:
{ "arctangent" : 0.5880026035475675 }
Converti in gradi
Come accennato, $atan2
restituisce il suo risultato in radianti. Puoi usare $radiansToDegrees
operatore se vuoi il risultato in gradi.
Esempio:
db.data.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
radians: { $atan2: [ "$a", "$b" ] },
degrees: { $radiansToDegrees: { $atan2: [ "$a", "$b" ] } }
}
}
]
)
Risultato:
{ "radians" : 0.5880026035475675, "degrees" : 33.690067525979785 }
In questo esempio, il primo campo presenta il risultato in radianti e il secondo campo lo presenta in gradi.
Valori decimali a 128 bit
Per impostazione predefinita, il $atan2
l'operatore restituisce i valori come double
, ma può anche restituire valori come decimali a 128 bit, purché l'espressione si risolva in un valore decimale a 128 bit.
Questo è il caso anche quando solo una delle espressioni è decimale a 128 bit.
Supponiamo di aggiungere i seguenti documenti alla nostra raccolta:
{ "_id" : 2, "a" : NumberDecimal("1.1301023541559787031443874490659"), "b" : NumberDecimal("2.1301023541559787031443874490659") }
{ "_id" : 3, "a" : 2, "b" : NumberDecimal("2.1301023541559787031443874490659") }
{ "_id" : 4, "a" : NumberDecimal("2.1301023541559787031443874490659"), "b" : 2 }
Eseguiamo il $atan2
operatore contro tali documenti:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 2, 3, 4 ] } } },
{ $project: {
_id: 0,
arctangent: { $atan2: [ "$a", "$b" ] }
}
}
]
)
Risultato:
{ "arctangent" : NumberDecimal("0.4877792766738730791507215461936449") } { "arctangent" : NumberDecimal("0.7539075768401526572881006364456838") } { "arctangent" : NumberDecimal("0.8168887499547439619432210551940676") }
In tutti i casi, l'uscita è decimale a 128 bit.
Valori Nulli
I valori Null restituiscono null
quando si utilizza il $atan2
operatore. Questo è vero anche se l'unica delle espressioni è null
.
Supponiamo di aggiungere i seguenti documenti alla nostra raccolta:
{ "_id" : 5, "a" : null, "b" : 2 } { "_id" : 6, "a" : 2, "b" : null } { "_id" : 7, "a" : 2, "null" : null }
Eseguiamo il $atan2
operatore contro tali documenti:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 5, 6, 7 ] } } },
{ $project: {
_id: 0,
arctangent: { $atan2: [ "$a", "$b" ] }
}
}
]
)
Risultato:
{ "arctangent" : null } { "arctangent" : null } { "arctangent" : null }
Possiamo vedere che il risultato è null
in tutti i casi.
Valori NaN
Se l'argomento si risolve in NaN
, $atan2
restituisce NaN
.
Esempio:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 2, 3, 4 ] } } },
{ $project: {
_id: 0,
arctangent: { $atan2: [ "$a" * 1, "$b" ] }
}
}
]
)
Risultato:
{ "arctangent" : NumberDecimal("NaN") } { "arctangent" : NumberDecimal("NaN") } { "arctangent" : NaN }
Modifichiamolo leggermente, in modo da moltiplicare il campo b
invece del campo a
.
db.data.aggregate(
[
{ $match: { _id: { $in: [ 2, 3, 4 ] } } },
{ $project: {
_id: 0,
arctangent: { $atan2: [ "$a", "$b" * 1 ] }
}
}
]
)
Risultato:
{ "arctangent" : NumberDecimal("NaN") } { "arctangent" : NaN } { "arctangent" : NumberDecimal("NaN") }
E ora moltiplichiamo entrambi i campi:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 2, 3, 4 ] } } },
{ $project: {
_id: 0,
arctangent: { $atan2: [ "$a" * 1, "$b" * 1 ] }
}
}
]
)
Risultato:
{ "arctangent" : NaN } { "arctangent" : NaN } { "arctangent" : NaN }
Campi inesistenti
Se il $atan2
operatore viene applicato a un campo che non esiste, null
viene restituito.
Esempio:
db.data.aggregate(
[
{ $match: { _id: 1 } },
{ $project: {
_id: 0,
result: { $atan2: [ "$a", "$name" ] }
}
}
]
)
Risultato:
{ "result" : null }