MongoDB $pow 运算符

MongoDB $pow 运算符 介绍

MongoDB 提供了多种算术表达式运算符。$pow 运算符就是这些运算符之一。此运算符用于聚合管道阶段。此运算符用于查找数字的指数(幂)。

一个数的指数是多少?

指数(幂)是一个数字与自身相乘的结果。通常,指数以书面形式表示,如下图所示。

MongoDB $pow 运算符 语法

{ $pow: [ < number >, < exponent > ] }  

<number> 和 <exponent> 可以是任何有效的表达式,直到它解析为一个数字。

很重要的一点:

  1. 如果数字为 null,则 $pow 运算符返回 null。
  2. 如果数字引用了缺失的字段,则 $pow 运算符返回 null。
  3. 如果数字是 NaN,则 $pow 运算符返回 NaN。
序号 例子 输出结果
1. { $pow: [ 4, 0 ] } 1
2. { $pow: [ 4, 2 ] } 16
3. { $pow: [ 4, -2 ] } 0.0625
4. { $pow: [ -4, 0.5 ] } NaN

MongoDB $pow 运算符 例子

在以下示例中,我们正在使用:

Database: Yiidian
Collection: shapes  
Document: Six documents that contain the details of the shapes  
>db.shapes.find().pretty()
{
        {
         "_id" : 1, 
         "name" : "rectangle",
         "area" : 16
        }
        {
         "_id" : 2, 
         "name" : "square",
         "area" : 10
        }
        {
         "_id" : 3, 
         "name" : "circle",
         "perimeter" : 15,
         "area" : 10,
         "details" : { 
                           "radius" : 3,
                           "diameter" : 6
                          }
        }
        {
         "_id" : 4, 
         "name" : "rectangle",
         "area" : 0
        }
        {
         "_id" : 5, 
         "name" : "oval",
         "area" : 20
        }
        {
         "_id" : 6, 
         "name" : "triangle",
         "area" : 5
        }
        {
         "_id" : 7, 
         "name" : "rectangle",
         "area" : null
        }
}

示例 1:使用 $pow 运算符

在此示例中,我们使用 $pow 运算符将矩形形状中的“区域”字段提高指定的指数。

db.shapes.aggregate(  
 [  
   {$match: { name : "rectangle"}},  
      {  
          $project:   
              {  
                name : 1,  
                area : 1,  
                result : {$pow: ["$area", 3]}  
               }  
      }  
 ]  
) 

输出结果为:

{
         "_id" : 1, 
         "name" : "rectangle",
         "area" : 16,
         "result" : 4096
}
{
         "_id" : 4, 
         "name" : "rectangle",
         "area" : 0,
         "result" : 0
}
{
         "_id" : 7, 
         "name" : "rectangle",
         "area" : null,
         "result" : null
}

在此示例中,我们使用面积字段作为基数,使用 3 作为指数。因此,矩形的每个“面积”字段都按 3 的幂次方计算。

示例 2:负指数

如果基数为零 (0) 且指数为负数,则不能提高该数字。在这种情况下,它会返回错误消息。

db.shapes.aggregate(  
  [  
    { $match: { _id : 4 } },  
      {   
          $project:   
           {   
                name : 1,  
                area : 1,  
                result: { $pow: [ "$area", -3 ] }  
            }  
       }  
  ]  
)  

输出结果为:

uncaught exception : Error : command failed : {
	"ok" : 0,
	"errmsg" : "$pow cannot take a base of 0.and a negative exponent",
	"code" : 28764,
	"codeName" : "Location28764"4' [ ln;' lj; h
Lh;klh[pjlkh[pkoh[khp[o
} : aggregate failed:
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:618:17
assert.commandWorked@src/mongo/shell/assert.js:708:16
DB.prototype._runAggregate@src/mongo/shell/db.js:266:5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1046 : 12
@(shell) : 1 : 1

错误清楚地表明。“$pow 不能以 0 为底和负指数”。

db.shapes.aggregate(  
  [  
    { $match: { _id: 5  } },  
      {   
          $project:   
           {   
                name : 1,  
                area : 1,  
                result: { $pow: [ "$area", -3 ] }  
            }  
       }  
  ]  
)  

输出结果为:

{
         "_id" : 5, 
         "name" : "oval",
         "area" : 20,
         "result" : 0.000125  
}

示例 3:NULL值

我们已经在“示例 1”中看到,如果基数为 null,则结果也为 null。

如果指数的值为 null,它仍然会返回 null。

db.shapes.aggregate(  
  [  
    { $match: { _id: 6  } },  
      {   
          $project:   
           {   
                name : 1,  
                area : 1,  
                result: { $pow: [ "$area", null ] }  
            }  
       }  
  ]  
)  

输出结果为:

{
         "_id" : 6, 
         "name" : "triangle",
         "area" : 5,
         "result" : null  
}

示例 4:不存在的字段

如果 $pow 运算符应用于程序中不存在的字段,则返回 null。

db.shapes.aggregate(  
  [  
    { $match: { _id: 2  } },  
      {   
          $project:   
           {   
                name : 1,  
                area : 1,  
                result: { $pow: [ "$perimeter", null ] }  
            }  
       }  
  ]  
)  

输出结果为:

{
         "_id" : 2, 
         "name" : "square",
         "area" : 10,
         "result" : null  
}

 

热门文章

优秀文章