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")
}
相关推荐
lsc_blog9 小时前
年终自评别贴提交记录,把技术产出讲成变化
数据库·面试·职场和发展·跳槽·求职招聘
Zan16 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
这个DBA有点耶17 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
SelectDB18 小时前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
数据库小学妹19 小时前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
爱吃奥利奥_wen19 小时前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
我不会起名字32220 小时前
消费回调固定 return nil:错误传播与 Kafka 位点提交的区别
后端·mongodb·kafka·go·im·故障排查
这个DBA有点耶20 小时前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
测试界的小码农1 天前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j