Aggregation

PPG007 ... 2021-12-26 About 2 min

# Aggregation

Aggregation 中可以将多个操作组合起来,每个操作就是一个 stage,数据像在管道中流动。

# stages

除了 $out、$merge、$geoNear,其他 stage 都可以在管道内出现多次。

  • $addFields:为文档添加新字段,输出已经存在的所有字段和新添加的字段。

    db.member.aggregate([{$addFields: {demo: "demo"}}])
    
    1
  • $bucket:将输入文档按规则进行划分。

    db.artists.aggregate([{$bucket: {groupBy: "$year_born",boundaries: [1840, 1850, 1860, 1870, 1890]}}])
    
    1

    其中 groupBy 和 boundaries 字段必须要有,groupBy 指明分组的依据字段,boundaries 是一个数组,用来将 groupBy 的字段进行范围划分,必须要将 groupBy 字段的最大最小值包含在内,且是同一类型。

  • $bucketAuto:将文档分组,但是 boundaries 是自动的,不需要再指定。

    db.artists.aggregate([{$bucketAuto: {groupBy: "$year_born", buckets: 4}}])
    
    1

    需要同时指定 groupBy 和 buckets,buckets 用来决定分成几组。

  • $count:将输入文档的数量输出。

    db.member.aggregate([{$count: "demo"}])
    
    1

    $count 后接一个字符串,这个字符串就是输出的数量的键,不能是空字符串,不能以 $ 开头,不能包含 .

  • $facet:定义多个字段,每个字段可以使用各自的 stage,在输出中,每个字段一个键。

    db.artists.aggregate([{$facet: {"add": [{$addFields: {add: "add"}}], "count": [{$count: "count"}], "groupBy": [{$bucketAuto: {groupBy: "$year_born", buckets: 5}}]}}])
    
    1
  • $group:分组,必须指定 _id,这个字段类似 groupBy。

    // 计数
    db.artists.aggregate([{$group: {_id: null,count: {$sum: 1}}}])
    
    // 过滤重复值
    db.artists.aggregate([{$group: {_id: "$nationality"}}])
    
    1
    2
    3
    4
    5
  • $limit:限制输出结果数量。

    db.artists.aggregate([{$limit: 2}])
    
    1
  • $lookup:执行连接操作。

    // 等值连接,输出的每个文档有一个 inventory_docs 字段,是一个数组,里面是第二个集合中的内容。
    db.orders.aggregate([{$lookup: {from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs"}}])
    
    // 如果 localField 是一个数组,那么不需要 unwind 就能将数组中的每一个元素进行连接。
    
    1
    2
    3
    4
  • $match:过滤。

    db.artists.aggregate([{$match: {year_died: {$lte: 1920}}}])
    
    1
  • $project:决定要显示在结果中的字段。

    db.artists.aggregate([{$match: {year_died: {$lte: 1920}}}, {$project: {last_name: 1, _id: 0}}])
    
    1
  • $sample:从输入中随机选几个文档输出。

    db.artists.aggregate([{$sample: {size: 3}}])
    
    1
  • $set:添加、修改输入文档的字段值。

    db.artists.aggregate([{$set: {time: new Date()}}])
    
    1
  • $skip:跳过指定数量的输入的文档,将剩余的文档输出。

    db.artists.aggregate([{$skip: 5}, {$count: "num"}])
    
    1
  • $sorted:对输入的文档进行排序。

    // 1 是升序排列,-1 是降序排列。
    db.artists.aggregate([{$sort: {year_born: 1, year_died: -1}}])
    
    1
    2
  • sortByCount:将输入的文档根据规则分组,然后计算每个分组中的元素数量,输出的文档包含一个 _id 字段,其中是这个分组的分组依据的值,一个 count 字段,是这一组的元素个数。

    db.artists.aggregate([{$sortByCount: "$nationality"}])
    
    1
  • $unset:从输入的文档中删除某个字段。

    db.artists.aggregate([{$sortByCount: "$nationality"}, {$unset: "_id"}])
    
    1
  • unwind:解构一个数组字段。

    db.member.aggregate([{$unwind:"$tags"}])
    
    1
Last update: December 26, 2021 04:26
Contributors: PPG007