mongo基础之 聚合命令 aggregation(4)

聚合操作介绍  

 db.collection.aggregate( [pipeline], ) - performs an aggregation on a collection; returns a cursor
 2个参数,一个管道列表  一个可选参数

管道包括多个阶段

阶段 描述
$addFields

向文档添加新字段。类似于 $project$addFields重塑流中的每个文档; 具体而言,通过向输出文档添加新字段,该文档包含输入文档和新添加字段中的现有字段。

格式 { $addFields: { : , ... } }
示例 db.scores.aggregate( [
   {
     $addFields: {
       totalHomework: { $sum: "$homework" } ,
       totalQuiz: { $sum: "$quiz" }
     }
   },
   {
     $addFields: { totalScore:
       { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
   }
] )

expression 部分一般就是 公式 和 字段 ,字段一般用$column 表示。

$bucket

根据指定的表达式和存储区边界,将传入的文档分组,称为存储桶。

db.artwork.aggregate( [
  {
    $bucket: {
      groupBy: "$price",
      boundaries: [ 0, 200, 400 ],
      default: "Other",
      output: {
        "count": { $sum: 1 },
        "titles" : { $push: "$title" }
      }
    }
  }
] )
$bucketAuto

根据指定的表达式将传入的文档分类为特定数量的组(称为存储桶)。自动确定存储桶边界,以尝试将文档均匀地分配到指定数量的存储桶中。

db.artwork.aggregate( [
   {
     $bucketAuto: {
         groupBy: "$price",
         buckets: 4
     }
   }
] )
$collStats

返回有关集合或视图的统计信息。

包括读写时间个数,存储信息统计。

db.matrices.aggregate( [ { $collStats: { storageStats: { } } } ] )
$count 返回聚合管道此阶段的文档数量计数。
db.scores.aggregate(
  [
    {
      $match: {
        score: {
          $gt: 80
        }
      }
    },
    {
      $count: "passing_scores"
    }
  ]
)

$count 后 跟字段名字,一共进来多少个文档

$facet

在同一组输入文档的单个阶段内处理多个聚合管道。支持创建能够在单个阶段中跨多个维度或方面表征数据的多面聚合。

{ $facet:
   {
      : [ , , ... ],
      : [ , , ... ],
      ...

   }
}

db.artwork.aggregate( [
  {
    $facet: {
      "categorizedByTags": [
        { $unwind: "$tags" },
        { $sortByCount: "$tags" }
      ],
      "categorizedByPrice": [
        { $match: { price: { $exists: 1 } } },
        {
          $bucket: {
            groupBy: "$price",
            boundaries: [  0, 150, 200, 300, 400 ],
            default: "Other",
            output: {
              "count": { $sum: 1 },
              "titles": { $push: "$title" }
            }
          }
        }
      ],
      "categorizedByYears(Auto)": [
        {
          $bucketAuto: {
            groupBy: "$year",
            buckets: 4
          }
        }
      ]
    }
  }
])

$geoNear

基于与地理空间点的接近度返回有序的文档流。集成的功能 $match$sort以及$limit地理空间数据。输出文档包括附加距离字段,并且可以包括位置标识符字段。

{ $geoNear: {  } }
db.places.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
        key:"location",
        distanceField: "dist.calculated",
        maxDistance: 2,
        query: { category: "Parks" },
        includeLocs: "dist.location",
        spherical: true
     }
   }
])

$graphLookup

对集合执行递归搜索。对于每个输出文档,添加一个新的数组字段,其中包含该文档的递归搜索的遍历结果。

db.employees.aggregate( [
   {
      $graphLookup: {
         from: "employees",
         startWith: "$reportsTo",
         connectFromField: "reportsTo",
         connectToField: "name",
         as: "reportingHierarchy"
      }
   }
] )
$group

按指定的标识符表达式对文档进行分组,并将累加器表达式(如果已指定)应用于每个组。消耗所有输入文档,并为每个不同的组输出一个文档。输出文档仅包含标识符字段,如果指定,则包含累积字段。

{
  $group:
    {
      _id: , // Group By Expression
      : {  :  },
      ...
    }
 }
db.sales.aggregate(
  [
    // First Stage
    {
      $group :
        {
          _id : "$item",
          totalSaleAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } }
        }
     },
     // Second Stage
     {
       $match: { "totalSaleAmount": { $gte: 100 } }
     }
   ]
 )
$indexStats

返回有关集合的每个索引的使用的统计信息。

db.orders.aggregate( [ { $indexStats: { } } ] )
$limit

将未修改的前n个文档传递给管道,其中n是指定的限制。对于每个输入文档,输出一个文档(对于前n个文档)或零文档(在前n个文档之后)。

db.article.aggregate(
    { $limit : 5 }
);
$listSessions

列出活动时间足以传播到system.sessions集合的所有会话。

db.system.sessions.aggregate( [ { $listSessions: { users: [ {user: "myAppReader", db: "test" } ] } } ] )
$lookup

同一数据库中的另一个集合执行左外连接,以 从“已连接”集合中过滤文档以进行处理。

表连接查询

{
  $lookup: {
    from: "otherCollection",
    as: "resultingArray",
    localField: "x",
    foreignField: "y"
  }
}
$match 过滤文档流以仅允许匹配的文档未经修改地传递到下一个管道阶段。 $match使用标准的MongoDB查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。
$out

将聚合管道的结果文档写入集合。要使用$out舞台,它必须是管道中的最后一个阶段。

db.books.aggregate( [
                      { $group : { _id : "$author", books: { $push: "$title" } } },
                      { $out : "authors" }
] )
$project

重新整形流中的每个文档,例如添加新字段或删除现有字段。对于每个输入文档,输出一个文档。

db.books.aggregate( [ { $project : { title : 1 , author : 1 } } ] )
$redact

access level 存取等级 有三种:
- $$DESCEND 返回当前等级的文档,排除掉该等级下的内嵌等级文档;
- $$PRUNE 排除掉满足条件的当前等级及其下属等级的所有内容,而不再检查其内嵌文档是否还有满足条件的内容;
- $$KEEP 保留满足条件的当前等级及其下属等级的所有内容,而不再检查其内嵌文档是否有满足条件的内容;

与其他完全过滤不同,$redact聚合是对文档内部进行操作,返回的是经过删减的文档,而不是将整个文档都删除掉。该操作符常常和$cond一起使用。

var userAccess = [ "STLW", "G" ];
db.forecasts.aggregate(
   [
     { $match: { year: 2014 } },
     { $redact: {
        $cond: {
           if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] },
           then: "$$DESCEND",
           else: "$$PRUNE"
         }
       }
     }
   ]
);

$replaceRoot

用指定的嵌入文档替换文档。该操作将替换输入文档中的所有现有字段,包括_id字段。指定嵌入在输入文档中的文档以将嵌入文档提升到顶层。

db.people.aggregate( [
   { $replaceRoot: { newRoot: { $mergeObjects:  [ { dogs: 0, cats: 0, birds: 0, fish: 0 }, "$pets" ] }} }
] )

$sample

从输入中随机选择指定数量的文档。

db.users.aggregate(
   [ { $sample: { size: 3 } } ]
)

$skip

跳过前n个文档,其中n是指定的跳过编号,并将未修改的其余文档传递给管道。对于每个输入文档,输出零文档(对于前n个文档)或一个文档(如果在前n个文档之后)。

db.article.aggregate(
    { $skip : 5 }
);

$sort

按指定的排序键重新排序文档流。只有订单改变; 文件保持不变。对于每个输入文档,输出一个文档。

db.users.aggregate(
   [
     { $sort : { age : -1, posts: 1 } }
   ]
)

$sortByCount

根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档计数。

db.exhibits.aggregate( [ { $unwind: "$tags" },  { $sortByCount: "$tags" } ] )
$unwind

从输入文档解构数组字段以输出每个元素的文档。每个输出文档都使用元素值替换数组。对于每个输入文档,输出n个文档,其中n是数组元素的数量,对于空数组,可以为零。

db.inventory2.aggregate( [
   { $unwind: { path: "$sizes", preserveNullAndEmptyArrays: true } }
] )

$set
修改或者添加新字段
db.animals.aggregate( [
  { $set: { "cats": 20 } }
] )
$unset

删除多个字段

db.books.aggregate([
   { $unset: [ "isbn", "copies" ] }
])
$replaceWith

删除多个字段

db.books.aggregate([
   { $unset: [ "isbn", "copies" ] }
])
$unset

删除多个字段

db.books.aggregate([
   { $unset: [ "isbn", "copies" ] }
])

db.aggregate()阶段

从3.6版开始,MongoDB还提供了以下 db.aggregate方法:

以下阶段使用db.aggregate()方法而不是db.collection.aggregate()方法。

阶段 描述
$currentOp 返回有关MongoDB部署的活动和/或休眠操作的信息。
$listLocalSessions 列出最近在当前连接mongosmongod 实例上使用的所有活动会话。这些会话可能尚未传播到system.sessions集合中。

其他聚合操作符,参考 http://www.mongoing.com/docs/reference/operator/aggregation-pipeline.html

db.getCollection('process').aggregate([

    {

        $match :{"xx":{$in:["xx1","xx2"]}}

    },

    {

        $sort:{"create_time":-1}

    },

    {

        $skip :14

    },

    {

      $limit:1

    },

    {

        $unwind: { 

            path: "$processResult.factor_list",

            includeArrayIndex: "arrayIndex",

            preserveNullAndEmptyArrays: true

        }

    },

    {

        $project : {

            source_id : 1 ,

            create_at: '$create_time',

            credit_id: 1,

            _id:0,

            hello:"asd",

            event_code :1 ,

            processResult:'$processResult.factor_list'

           

        }

    },

    {

        $sort:{"processResult.name":-1}

    },

     {

      $limit:10

    },

    {

        $match :{"processResult.type":{$eq:"router"}}

    },

   

     {

        $group:{

              _id : "$source_id", 

              count: {$sum : 1},

              max_eventcode:{ "$max":"$event_code"},

              min_eventcode:{ "$min":"$event_code"},

              avg_eventcode:{ "$avg":"$event_code"},

              factor_types_list:{"$push":"$processResult.type"},

              factor_types_set:{"$addToSet":"$processResult.type"},

              firstcreditid:{"$first":"$credit_id"},

              lastcreditid:{"$last":"$credit_id"}

        }

    },

 {

        $group:{

              _id :  {'a': '$a', 'b': '$b', 'D': '$D'}, 

              count: {$sum : 1},

              max_eventcode:{ "$max":"$event_code"},

              min_eventcode:{ "$min":"$event_code"},

              avg_eventcode:{ "$avg":"$event_code"},

              factor_types_list:{"$push":"$processResult.type"},

              factor_types_set:{"$addToSet":"$processResult.type"},

              firstcreditid:{"$first":"$credit_id"},

              lastcreditid:{"$last":"$credit_id"}

        }

    },

  {$out: 'hh_col’},

   {

        $match :{"count":{$gt:5}}

    },

    ]

    ,{allowDiskUse: true}

)

聚合管道的优化 http://www.mongoing.com/docs/core/aggregation-pipeline-optimization.html

聚合管道的限制 http://www.mongoing.com/docs/core/aggregation-pipeline-limits.html

聚合管道和分片集合 http://www.mongoing.com/docs/core/aggregation-pipeline-sharded-collections.html

你可能感兴趣的:(mongodb)