mongodb--聚合操作

发布时间 2023-04-16 18:42:36作者: 洛小依ovo

一、简单介绍

mongodb的聚合操作分为管道操作和MapReduce操作等。

  • 聚合管道操作:将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理
  • MapReduce操作:是将集合中的批量文档进行分解处理,然后将处理后的各个结果进行合并输出

 

二、聚合管道操作

1、语法结构:

piplines = [pipe1,pipe2,...]
db.COLLECTION_NAME.aggregate([pipelines],options)

参数说明:

  • pipelines:每一个pip都是一个管道操作
  • options:可选项

2、常见的管道操作符

常见管道操作符  说明
  $group   将集合中的文档进行分组,便于后续统计结果
  $limit   用于限制MongoDB聚合管道返回的文档数
  $match   用于过滤数据,只输出符合条件的文档
  $sort   将输入的文档先进行排序,再输出
  $project

  用于修改输入文档的结构(增加、删除字段等)和名称,控制字段显示规则,0不显示/1显示

  $skip

  在聚合管道中跳过指定数量的文档,并返回剩余文档

 

3、语法结构

-- $group 操作符
db.COLLECTION_NAME.aggregate( [ { $group:{<key1>:"$<key2>"} } ] )
-- <key1>:别名;<key2>:以key2字段分组group

-- slimit 操作符
db.COLLECTION_NAME.aggregate( { $limit:整型数字 } )

-- Smatch 操作符
db.COLLECTION NAME.aggregate( [ { $match:{<key>:<value>} } ] )
-- <key> 字段名;<value> 字段值

-- $sort 操作符,-1表示降序,1 表示升序
db.COLLECTION NAME.aggregate( [ { $sort:{<key>:-1或1} } ] )

-- $project 操作符
db.COLLECTION NAMB.aggregate( [ { $project:{<key>:<value>} ] } ] )

-- $skip操作符
db.COLLECTION_NAME.aggregate( { $skip:整型数字 } )

4、举例说明

db.comment.aggregate([{$group:{_id:"$userid"}}])
db.comment.aggregate({$limit:3})
db.comment.aggregate([{$match:{nickname:"罗密欧"}}])
db.comment.aggregate([{$sort:{age:-1}}])
db.comment.aggregate([{$project:{_id:0}}])
db.comment.aggregate({$skip:4})

5、管道表达式

  管道阶段操作器的值被称为管道表达式,并且每个管道表达式都是一个文档结构,由字段名称、字段值、和管道表达式组成

  1)常见的管道表达式

常见管道表达式 说明
  $sum   计算总和
  $avg   计算平均值
  $min   获取集合中所有文档对应值的最小值
  $max   获取集合中所有文档对应值的最大值
  $push   在结果文档中插入值到一个数组中
  $first   获取分组文档中的第一个文档
  $last   获取分组文档中的最后一个文档

 

  2)语法结构

-- sum表达式
db.COLLECTION_NAME.aggregate([{
    管道操作符: {
        < key1 > : "$<key2>",
        < key3 > : {
            $sum: $ < key4 > 
        }
    }
}])
-- key1 管道操作字段完结果的别名
-- key2 字段名
-- key3 管道表达式结果的别名
-- key4 进行管道表达式操作的字段

   3)举例说明

-- 数据
db.product.insertMany([
{_id:"1",name:"iPhone 8",price:3000,type:"电子通讯"},
{_id:"2",name:"adidas neo",price:700,type:"服装"},
{_id:"3",name:"nike air max 90",price:760,type:"服装"},
{_id:"4",name:"HuaWei mate30",price:5000,type:"电子通讯"},
{_id:"5",name:"vivo x27",price:2000,type:"电子通讯"},
])

-- 以type字段分组,将pice字段求和输出
db.product.aggregate([{
    $group: {
        "_id": "$type",
        "price": {
            $sum: "$price"
        }
    }
}])

-- 以price字段过滤大于700的数值,然后传到下一个管道,
-- 以type字段分组,把找到的第一个文档的name字段显示,用product别名表示
db.product.aggregate([{
    $match: {
        price: {
            $gt: 700
        }
    }
}, {
    $group: {
        _id: "$type",
        product: {
            $first: "$name"
        }
    }
}])

 

三、MapReduce操作

---

---