MongoDB聚合运算符:$atan2

$atan2用来计算反正切,返回指定表达式的反正切值,与$antan的区别主要是参数不同。

语法

js 复制代码
{ $atan2: [<expression1>, <expression1>] }
  • <expression>为可被解析为数值的表达式
  • $atan2返回弧度,使用$radiansToDegrees运算符可以把弧度转换为角度
  • $atan2默认返回双精度数double,如果表达式<expression>解析为128-bit decimal则返回同样类型。

使用

如果任一参数解析为null,则结果返回null;如果任一参数解析为NaN,则结果返回NaN;如果一个参数解析为null,另一个解析为NaN,则结果返回null,如下表所示:

示例 结果
{ $atan2: [NaN, <value>} NaN
{ $atan2: [ <value>, NaN ] } NaN
{ $atan2: [ null, <value> ] } null
{ $atan2: [ <value>, null ] } null
{ $atan2: [ NaN, null ] } null
{ $atan2: [ null, NaN ] } null

举例

trigonometry集合中有下面的文档,包含了直角三角形的三条边:

json 复制代码
{
  "_id" : ObjectId("5c50782193f833234ba90d85"),
  "side_a" : NumberDecimal("3"),
  "side_b" : NumberDecimal("4"),
  "hypotenuse" : NumberDecimal("5")
}

反正切角度

下面的聚合操作使用$atan2表达式计算与边side_a相邻的角度,然后使用$radiansToDegrees运算符将结果转换为度数,最后使用$addFields管道阶段将其添加到输入文档。

js 复制代码
db.trigonometry.aggregate([
  {
    $addFields : {
      "angle_a" : {
        $radiansToDegrees : {
          $atan2 : [ "$side_b", "$side_a" ]
        }
      }
    }
  }
])

执行的结果为:

json 复制代码
{
  "_id" : ObjectId("5c50782193f833234ba90d85"),
  "side_a" : NumberDecimal("3"),
  "side_b" : NumberDecimal("4"),
  "hypotenuse" : NumberDecimal("5"),
  "angle_a" : NumberDecimal("53.13010235415597870314438744090658")
}

反正切弧度

与上例不同,在求反正切后,没有进行度数的转换,结果为弧度:

js 复制代码
db.trigonometry.aggregate([
  {
    $addFields : {
      "angle_a" : {
        $atan2 : [ "$side_b", "$side_a" ]
      }
    }
  }
])

结果为:

json 复制代码
{
  "_id" : ObjectId("5c50782193f833234ba90d85"),
  "side_a" : NumberDecimal("3"),
  "side_b" : NumberDecimal("4"),
  "hypotenuse" : NumberDecimal("5"),
  "angle_a" : NumberDecimal("0.9272952180016122324285124629224287")
}
相关推荐
存在的五月雨12 小时前
Mysql 索引的一些
数据库·mysql
黄俊懿12 小时前
MySQL主从复制:从“异步“到“GTID“,数据同步的进化之路
数据库·sql·mysql·oracle·架构·dba·db
看海的四叔13 小时前
【SQL】SQL-管好你的字符串
大数据·数据库·hive·sql·数据分析·字符串
秋913 小时前
TiDB 数据库全链路实战指南:从下载部署到 Java 高并发调优
java·数据库·tidb
zhou周大哥13 小时前
银河麒麟安装mysql
数据库·mysql
无敌的黑星星14 小时前
Spring @Transactional 注解全解析
java·数据库·oracle
Rust研习社14 小时前
Rust + PostgreSQL 极简技术栈应用开发
开发语言·数据库·后端·http·postgresql·rust
河阿里14 小时前
MyBatis-Plus:MyBatis的进阶开发
数据库·mybatis
sjsjsbbsbsn14 小时前
向量数据库
数据库
逸Y 仙X14 小时前
文章十六:ElasticSearch 使用enrich策略实现大宽表
java·大数据·数据库·elasticsearch·搜索引擎·全文检索