MongoDB 基础系列十七:聚合查询之 Aggregation Pipeline - Aggregation Command

前言

此篇博文是 Mongdb 基础系列之一;

本文为作者的原创作品,转载需注明出处;

简介

除了前文所述的那样,通过 aggregation 方法 来启用 MongoDB 的 Aggregation Pipeline 的操作,同时还提供了直接通过 aggregation 命令行的方式来启用 Aggregation Pipeline;本文将会描述如何通过 aggregation command 的方式来启动 Aggregation Pipeline;

例子

直接从一个例子入手,来快速的了解,假设我们有一个 articles collection 如下,

1
2
3
4
5
6
{
_id: ObjectId("52769ea0f3dc6ead47c9a1b2"),
author: "abc123",
title: "zzz",
tags: [ "programming", "database", "mongodb" ]
}

比如我们向统计 tags 在上述记录中出现的总数;

1
2
3
4
5
6
7
8
9
db.runCommand( {
aggregate: "articles",
pipeline: [
{ $project: { tags: 1 } },
{ $unwind: "$tags" },
{ $group: { _id: "$tags", count: { $sum : 1 } } }
],
cursor: { }
} )
  • aggregate
    aggregate: “articles”,表示对 articles collection 进行聚合查询操作;

  • pipeline
    设置相关的 stages,如下所述,

    • $project
      { $project: { tags: 1 } },意思是,只需要将 tags 字段进行输出进行聚合即可;
    • $unwind,将一个类型为 array 的字段,按照每一个 array 值将其拆分成多个独立的文档进行输出,比如我们有如下的数据,

      1
      { "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }

      通过 $unwind 对其进行拆分

      1
      db.inventory.aggregate( [ { $unwind : "$sizes" } ] )

      得到的结果如下,

      1
      2
      3
      { "_id" : 1, "item" : "ABC1", "sizes" : "S" }
      { "_id" : 1, "item" : "ABC1", "sizes" : "M" }
      { "_id" : 1, "item" : "ABC1", "sizes" : "L" }

      所以,回到这里的例子,将会把数组 [ “programming”, “database”, “mongodb” ] 分别拆分成三个只包含字段 tags 的文档,分别是,

      1
      2
      3
      {"programming"}
      {"database"}
      {"mongodb"}
  • cursor
    对应相关的 option 参数,这里通过 cursor: {} 表示设置 cursor 的 batch size 为默认值;

相应的,如果我们要使用 db.collection.aggregation() 来做同样的事情的话,

1
2
3
4
5
db.articles.aggregate( [
{ $project: { tags: 1 } },
{ $unwind: "$tags" },
{ $group: { _id: "$tags", count: { $sum : 1 } } }
] )

定义

完整的调用格式为,

1
2
3
4
5
6
7
8
9
10
11
db.runCommand( {
aggregate: "<collection>",
pipeline: [ <stage>, <...> ],
explain: <boolean>,
allowDiskUse: <boolean>,
cursor: <document>,
maxTimeMS: <int>,
bypassDocumentValidation: <boolean>,
readConcern: <document>,
collation: <document>
} )

每个参数的详细描述可以参考aggregation 方法中的描述;