美文网首页
MongoDB开发之 管道操作符

MongoDB开发之 管道操作符

作者: 五月笙 | 来源:发表于2021-01-06 11:08 被阅读0次

数据

for (i = 0; i < 100; i++) {
    db.machineLog.insert({
        "content": "机械日志" + i,
        "machineName": "测试机械00" + i,
        "categoryId": i % 3,
        "machineId": i % 8,
        "price": (i % 7) * (i % 5) * 32,
        "createdAt": new Date()
    })
}

引子

获取MongoDB存储的数据,往往不是直接提取出来就可以使用的,需要对数据进行处理和分析后才可以使用。MongoDB提供了三种执行聚合的方式:聚合管道,map-reduce 函数和单一目的聚合方法。

语法

db.COLLECTION_NAME.aggregate( [ {}, {}, ... ] )

其中每个'{}'标识一个阶段。

操作符

$match

用于过滤数据,只输出符合条件的文档,SQL Example:

SELECT *
FROM machine
WHERE machineName = '测试机械002'

MongoDB Example:

db.machineLog.aggregate([
    {
        $match: {
            machineName: '测试机械002'
        }
    }
])

$group

将集合中的文档分组,可用于统计结果,SQL Example:

SELECT machineId,
       SUM(price) AS total
FROM machineLog
GROUP BY machineId
db.machineLog.aggregate([
    {
        $group: {
            _id: "$machineId",
            total: {
                $sum: "$price"
            }
        }
    }
])

即将machineId进行分组后,对price进行求和。

$project

修改输入文档的结构,限定结果集合,SQL Example:

SELECT machineId FROM orders

MongoDB Example:

db.machineLog.aggregate([
    {
        $project: {
            machineId: "$machineId",
        }
    }
])

#### $sort

将输入文档排序后输出,SQL Example:

```SQL
SELECT machineId FROM machineLog ORDER BY id

MongoDB Example:

db.machineLog.aggregate([
    {
        $sort: {
            id: 1
        }
    }
])

其他

MongoDB 聚合运算符还有很多,这里只对常用的做了简单的描述,具体的可以参照下表:

SQL Terms, Functions, and Concepts MongoDB Aggregation Operators
WHERE $match
GROUP BY $group
HAVING $match
SELECT $project
ORDER BY $sort
LIMIT $limit
SUM() $sum
COUNT() sum,sortByCount
JOIN $lookup
SELECT INTO NEW_TABLE $out
MERGE INTO TABLE $merge (Available starting in MongoDB 4.2)

聚合管道

MongoDB’s aggregation framework is modeled on the concept of data processing pipelines. Documents enter a multi-stage pipeline that transforms the documents into an aggregated result. 

聚合管道操作有如:分组(group)、修改数据结构(project)、排序(sort)、计算数量(count)等,每个操作在管道中叫做阶段(stage),每个阶段执行的结果会给下一个阶段。

如图:

../images/map-reduce.bakedsvg.svg

其类似Linux中的管道操作:

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1

分四步:

  1. /dev/urandom 中读取字符
  2. tr 命令过滤出字母及数字
  3. 通过 fold 每行进行切割
  4. 选择输出第一行

示例一

db.machineLog.aggregate([
    {
        $match: {
            categoryId: 2
        }
    },
    {
        $group: {
            _id: "$machineId",
            total: {
                $sum: "$price"
            }
        }
    },
    {
        $match: {
            total: {
                $gt: 800
            }
        }
    }
])

上面示例分为三步:

  1. 查询categoryId=2的数据
  2. 对上一步查询的数据以machineId分组后,对price进行求和
  3. 找出求和后大于800的数据

查询结果为:

{
    "_id": 1,
    "total": 1024
}
{
    "_id": 3,
    "total": 1088
}

参考

MongoDB Documentation aggregation
MongoDB权威指南

相关文章

网友评论

      本文标题:MongoDB开发之 管道操作符

      本文链接:https://www.haomeiwen.com/subject/imlpoktx.html