- 概述
- 函数操作
- 函数操作
概述
函数操作
函数操作可以配合匹配符和选择符使用,以实现更复杂的功能。
- 配合匹配符一起使用,可以对字段进行各种函数运算之后,再执行匹配操作。
以下示例,匹配字段a长度为3的记录:
- > db.foo.bar.find({a:{$strlen:1, $et:3}})
Note: 先获取字段a的长度,再用该长度与3比较,返回长度为3的记录。
- 作为选择符使用,可以对选取的字段进行函数运算,返回运算后的结果。
以下示例,返回将字段a转大写的结果:
- > db.foo.bar.find({}, {a:{$upper:1}})
所有支持的函数操作如下:
函数 | 描述 | 示例 |
---|---|---|
$abs | 取绝对值 | db.foo.bar.find({}, {a:{$abs:1}}) |
$ceiling | 向上取整 | db.foo.bar.find({}, {a:{$ceiling:1}}) |
$floor | 向下取整 | db.foo.bar.find({}, {a:{$floor:1}}) |
$mod | 取模运算 | db.foo.bar.find({}, {a:{$mod:1}}) |
$add | 加法运算 | db.foo.bar.find({}, {a:{$add:10}}) |
$subtract | 减法运算 | db.foo.bar.find({}, {a:{$subtract:10}}) |
$multiply | 乘法运算 | db.foo.bar.find({}, {a:{$multiply:10}}) |
$divide | 除法运算 | db.foo.bar.find({}, {a:{$divide:10}}) |
$substr | 截取子串 | db.foo.bar.find({}, {a:{$substr:[0,4]}}) |
$strlen | 获取字符串长度 | db.foo.bar.find({}, {a:{$strlen:10}}) |
$lower | 字符串转为小写 | db.foo.bar.find({}, {a:{$lower:1}}) |
$upper | 字符串转为大写 | db.foo.bar.find({}, {a:{$upper:1}}) |
$ltrim | 去除左侧空格 | db.foo.bar.find({}, {a:{$ltrim:1}}) |
$rtrim | 去除右侧空格 | db.foo.bar.find({}, {a:{$rtrim:1}}) |
$trim | 去除左右两侧空格 | db.foo.bar.find({}, {a:{$trim:1}}) |
$cast | 转换字段类型 | db.foo.bar.find({}, {a:{$cast:"int32"}}) |
$size | 获取数组元素个数 | db.foo.bar.find({}, {a:{$size:1}}) |
$type | 获取字段类型 | db.foo.bar.find({}, {a:{$type:1}}) |
$slice | 截取数组元素 | db.foo.bar.find({}, {a:{$slice:[0,2]}}) |
函数操作可以支持流水线式处理,多个函数流水线执行:
- > db.foo.bar.find({a:{$trim:1, $upper:1, $et:"ABC"}})
Note:
先对字段a去除左右两侧空格,然后再转换成大写,最后匹配与"ABC"相等的记录
当字段类型为数组类型时,函数会对该字段做一次展开,并对每个数组元素执行函数操作。
以取绝对函值函数为例:
- > db.foo.bar.find()
- {
- "a": [
- 1,
- -3,
- -9
- ]
- }
- > db.foo.bar.find({}, {a:{$abs:1}})
- {
- "a": [
- 1,
- 3,
- 9
- ]
- }