MongoDB 聚合管道运算

聚合管道运算符构造用于聚合管道阶段的表达式。以下是聚合管道运算符的列表。

一、MongoDB 算法表达式运算符

算法表达式运算符用于对数字执行算术运算。一些算术表达式还支持数据算术。

$abs

abs 运算符返回数字的绝对值。

语法:

{ $abs: <number> }  

示例:

db.score.aggregate([  
   {  
     $school: { marks: { $abs: { $subtract: [ "$max", "$min" ] } } }  
   }  
])  

$add

它添加两个或多个数字和一个日期。如果其中一个参数是日期,则日期将另一个参数视为毫秒以添加到日期。

语法:

{ $add: [ <expression1>, <expression2>, ... ] }  

示例:

db.books.aggregate(  
   [  
     { $project: { item: 1, total: { $add: [ "$price", "$tax" ] } } }  
   ]  
)  

$ceil

ceil 运算符返回大于或等于指定数字的最小整数。

语法:

{ $ceil: <number> }  

示例:

db.samples.aggregate([ { $project: { value: 1, ceilingValue: { $ceil: "$value" } } } ])  

$divide

$divide将一个或多个数字除以另一个并返回结果。

语法:

{ $divide: [ <expression1>, <expression2> ] }  

示例:

db.planning.aggregate( [ { $project: { name: 1, workdays: { $divide: [ "$hours", 8 ] } } } ] )  

$exp

exp 运算符用于将欧拉数提高到指定的指数并返回结果。

语法:

{ $exp: <exponent> }  

示例:

db.accounts.aggregate( [ { $project: { effectiveRate: { $subtract: [ { $exp: "$rate"}, 1 ] } } } ] ) 

$floor

$floor 运算符返回小于或等于指定数字的最大整数。

语法:

{ $floor: <number> }  

示例:

db.samples.aggregate( [ { $project: { value: 1, floorValue: { $floor: "$value" } } } ] )  

$ln

$ln 运算符计算数字的自然对数并将结果作为双精度数返回。

语法:

{ $ln: <number> }  

示例:

db.sales.aggregate( [ { $project: { x: "$year", y: { $ln: "$sales"  } } } ] )  

$log

$log 运算符计算指定基数的对数,并将结果以双精度形式返回。

语法:

{ $log: [ <number>, <base> ] }  

示例:

db.examples.aggregate([  
   { $project: { bitsNeeded:  
      {  
         $floor: { $add: [ 1, { $log: [ "$positiveInt", 2 ] } ] } } }  
      }  
])  

$log10

$log10 运算符计算一个数字的以 10 为底的对数,并将结果作为双精度数返回。

语法:

{ $log10: <number> }  

示例:

db.samples.aggregate( [ { $project: { pH: { $multiply: [ -1, { $log10: "$H3O" } ] } } } ] )  

$mod

$mod 运算符将一个数字与另一个数字相除并返回余数。

语法:

{ $mod: [ <expression1>, <expression2> ] }  

示例:

db.planning.aggregate(  
   [  
     { $project: { remainder: { $mod: [ "$hours", "$tasks" ] } } }  
   ]  
)  

$multiply

$multiply 运算符给出两个或多个数字的乘积。

语法:

{ $multiply: [ <expression1>, <expression2>, ..... ] }

示例:

db.sales.aggregate( [ { $project: { date: 1, item: 1, total: { $multiply: [ "$price", "$quantity" ] } } } ] )  

$pow

$pow 运算符将数字提高到给定的指数并返回结果。

语法:

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

示例:

db.quizzes.aggregate( [ { $project: { variance: { $pow: [ { $stdDevPop: "$scores.score" }, 2 ] } } } ] )  

$round

$round 运算符将数字舍入为整数或指定的小数位。

语法:

{ $round : [ <number>, <place> ] }  

示例:

db.samples.aggregate( [ { $project: { roundedValue: { $round: [ "$value", 1 ] } } } ] )  

$sqrt

sqrt 运算符以 double 形式返回正数的平方根。

语法:

{ $sqrt: <number> }  

示例:

db.points.aggregate([  
   {  
     $project: {  
        distance: {  
           $sqrt: {  
               $add: [  
                  { $pow: [ { $subtract: [ "$p2.y", "$p1.y" ] }, 2 ] },  
                  { $pow: [ { $subtract: [ "$p2.x", "$p1.x" ] }, 2 ] }  
               ]  
           }  
        }  
     }  
   }  
]) 

$subtract

$subtract 运算符将两个或多个数字相减以返回该数字的差。

语法:

{ $subtract: [ <expression1>, <expression2> ] }  

示例:

db.sales.aggregate( [ { $project: { item: 1, total: { $subtract: [ { $add: [ "$price", "$fee" ] }, "$discount" ] } } } ] )  

$trunc

$trunc 命令从指定的小数位删除数据。

语法:

{ $trunc : [ <number>, <place> ] }  

示例:

db.samples.aggregate( [ { $project: { truncatedValue: { $trunc: [ "$value", 1 ] } } } ] )  

二、MongoDB 数组表达式运算符

$arrayElemAt

$arrayElemAt 返回指定数组索引处的元素。

语法:

{ $arrayElemAt: [ <array>, <idx> ] }  

示例:

db.users.aggregate([  
   {  
     $project:  
      {  
         name: 1,  
         first: { $arrayElemAt: [ "$favorites", 0 ] },  
         last: { $arrayElemAt: [ "$favorites", -1 ] }  
      }  
   }  
])  

$arrayToObject

$arrayToObject 运算符将数组转换为单个文档。

语法:

[ [ "item", "abc123"], [ "qty", 25 ] ]  

示例:

db.inventory.aggregate(  
   [  
      {  
         $project: {  
            item: 1,  
            dimensions: { $arrayToObject: "$dimensions" }  
         }  
      }  
   ]  
)  

$concatArrays

$concatArrays 运算符连接数组以返回串联数组。

语法:

{ $concatArrays: [ <array1>, <array2>, ... ] }  

示例:

db.warehouses.aggregate([  
   { $project: { items: { $concatArrays: [ "$instock", "$ordered" ] } } }  
])  

$filter

$filter 运算符根据指定条件选择数组的子集以返回结果。

语法:

{ $filter: { input: <array>, as: <string>, cond: <expression> } }  

示例:

db.sales.aggregate([  
   {  
      $project: {  
         items: {  
            $filter: {  
               input: "$items",  
               as: "item",  
               cond: { $gte: [ "$$item.price", 100 ] }  
            }  
         }  
      }  
   }  
]) 

$in

$in 运算符返回一个布尔值,指示指定的值是否在数组中。

语法:

{ $in: [ <expression>, <array expression> ] }

示例:

db.fruit.aggregate([  
  {  
    $project: {  
      "store location" : "$location",  
      "has bananas" : {  
        $in: [ "bananas", "$in_stock" ]  
      }  
    }  
  }  
])  

$indexOfArray

$indexOfArray 运算符在数组中搜索指定值的出现并返回第一次出现的数组索引。

语法:

{ $indexOfArray: [ <array expression>, <search expression>, <start>, <end> ] }  

示例:

db.inventory.aggregate(  
   [  
     {  
       $project:  
          {  
            index: { $indexOfArray: [ "$items", 2 ] },  
          }  
      }  
   ]  
)  

$isArray

$isArray 如果操作数是一个数组,它会确定并返回一个布尔值。

语法:

{ $isArray: [ <expression> ] }  

示例:

db.shop.aggregate( [ { $project: { items: { $cond:  
            { if: { $and: [ { $isArray: "$instock" }, { $isArray: "$ordered" } ] }, then: { $concatArrays: [ "$instock", "$ordered" ] },  
        else: "One or more fields is not an array." } } } } ) 

$map

$map 运算符将值附加到数组中的每个项目,并返回一个包含应用结果的数组。

语法:

{ $map: { input: <expression>, as: <string>, in: <expression> } }  

示例:

db.grades.aggregate(  
   [  
      { $project:  
         { adjustedGrades:  
            {  
              $map:  
                 {  
                   input: "$quizzes",  
                   as: "grade",  
                   in: { $add: [ "$$grade", 2 ] }  
                 }  
            }  
         }  
      }  
   ]  
}  

$objectToArray

$objectToArray 运算符将文档转换为数组。

语法:

{ $objectToArray: <object> }  

示例:

db.inventory.aggregate(  
   [  
      {  
         $project: {  
            item: 1,  
            dimensions: { $objectToArray: "$dimensions" }  
         }  
      }  
   ]  
) 

$range

$range 运算符返回一个数组,其元素是生成的数字序列。

语法:

{ $range: [ <start>, <end>, <non-zero step> ] }  

示例:

db.distances.aggregate([{  
    $project: {  
        _id: 0,  
        city: 1,  
        "Rest stops": { $range: [ 0, "$distance", 25 ] } } } ] )  

$reduce

$reduce 运算符将表达式应用于数组中的每个元素,并将它们组合成一个值。

语法:

{  
    $reduce: {  
        input: <array>,  
        initialValue: <expression>,  
        in: <expression>  
    }  
}  

示例:

db.clothes.aggregate( [ { $project: { "discountedPrice": {  
          $reduce: { input: "$discounts", initialValue: "$price", in: { $multiply: [ "$$value", { $subtract: [ 1, "$$this" ] } ] } } } } } ] ) 

$reverseArray

$reverseArray 以相反的顺序返回一个包含元素的数组。

语法:

{ $reverseArray: <array expression> }  

示例:

db.users.aggregate( [ { $project: {name: 1,  
reverseFavorites: { $reverseArray: "$favorites" } } } ] )  

$size

size 运算符计算并返回数组中的项目总数。

语法:

{ $size: <expression> }  

示例:

db.books.aggregate( [ { $project: { item: 1, numberOfColors: { $cond: { if: { $isArray: "$colors" }, then: { $size: "$colors" }, else: "NA"} } } } ] )  

$slice

$slice 运算符产生数组的子集。

语法:

{ $slice: [ <array>, <n> ] }  

示例:

db.books.aggregate( [ { $project: { name: 1, threeFavorites: { $slice: [ "$favorites", 3 ] } } }  
])  

$zip

$zip 运算符转置一个数组,以便输出数组的第一个元素是包含第一个输入数组的第一个元素的数组。

语法:

{  $zip: { inputs: [ <array expression1>,  ... ], useLongestLength: <boolean>, defaults:  <array expression> } }  

示例:

db.matrices.aggregate([{ $project: {  _id: false,   transposed: { $zip: { inputs: [  
          { $arrayElemAt: [ "$matrix", 0 ] },  
          { $arrayElemAt: [ "$matrix", 1 ] },  
          { $arrayElemAt: [ "$matrix", 2 ] },  
        ] } } } } ] )  

热门文章

优秀文章