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: [ <expression1>, <expression2> ] }
示例:
db.planning.aggregate( [ { project: { name: 1, workdays: {divide: [ "$hours", 8 ] } } } ] )
$exp
指数运算符用于将自然对数的底数e提高到指定的指数,并返回结果。
语法:
{ $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运算符计算一个数的自然对数,并将结果以double型返回。
语法:
{ $ln: <number> }
示例:
db.sales.aggregate( [ { project: { x: "year", y: { ln: "sales" } } } ] )
$log
log运算符用于计算指定底数下一个数的对数,并返回结果为double类型。
语法:
{ $log: [ <number>, <base> ] }
示例:
db.examples.aggregate([
{ project: { bitsNeeded:
{floor: { add: [ 1, {log: [ "$positiveInt", 2 ] } ] } } }
}
])
$log10
log10运算符计算一个数字的以10为底的对数,并将结果返回为double类型。
语法:
{ $log10: <number> }
示例:
db.samples.aggregate( [ { project: { pH: {multiply: [ -1, { log10: "H3O" } ] } } } ] )
$mod
模运算符用于将一个数除以另一个数,并返回余数。
语法:
{ $mod: [ <expression1>, <expression2> ] }
示例:
db.planning.aggregate(
[
{ project: { remainder: {mod: [ "hours", "tasks" ] } } }
]
)
$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: [ <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 ] } } } ] )
数组表达式操作符
$arrayElemAt
它返回指定数组索引处的元素。
语法:
{ $arrayElemAt: [ <array>, <idx> ] }
示例:
db.users.aggregate([
{
project:
{
name: 1,
first: {arrayElemAt: [ "favorites", 0 ] },
last: {arrayElemAt: [ "$favorites", -1 ] }
}
}
])
$arrayToObject
数组ToObject操作符将一个数组转换为一个单独的文档。
语法:
[ [ "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> } }
示例:
$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: [ <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> } }
示例:
$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>
}
}
示例:
$reverseArray
它返回一个按照相反顺序排列的数组。
语法:
{ $reverseArray: <array expression> }
示例:
db.users.aggregate( [ { project: {name: 1,
reverseFavorites: {reverseArray: "$favorites" } } } ] )
$size
大小操作符计算并返回数组中的项总数。
语法:
{ $size: <expression> }
示例:
db.books.aggregate( [ { project: { item: 1, numberOfColors: {cond: { if: { isArray: "colors" }, then: { size: "colors" }, else: "NA"} } } } ] )
$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 ] },
] } } } } ] )