美文网首页
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