OPTIONS
翻译或纠错本页面

单一用途的聚合

聚合指的是一大类对数据集执行运算的方法,这些方法对输入数据执行特定的步骤从而计算出一个结果。MongoDB提供了一组对数据集执行特定操作的聚合方法。

尽管与 聚合管道映射化简 比起来,它们的使用范围有限,但是这些方法的名称很直观的表达了它的功能,非常易于理解使用。

总数

MongoDB可以返回符合查询条件的文档总数。除了 count 命令, mongo 脚本程序中的 count() 方法和 cursor.count() 方法都可以得到文档总数。

例子

现在有一个名为 records 的集合中 只有 下面这些文档:

{ a: 1, b: 0 }
{ a: 1, b: 1 }
{ a: 1, b: 4 }
{ a: 2, b: 2 }

下面的操作会统计集合中的文档个数,并最终返回数字 4:

db.records.count()

下面的操作会统计字段 a 的值是 1 的文档个数,最终返回 3:

db.records.count( { a: 1 } )

去除重复

去除重复 操作会返回查询到的指定字段值不重复的记录。在 mongo 脚本程序中,使用 distinct 命令或者 db.collection.distinct() 方法执行去重。请看下面的去除重复的例子:

Diagram of the annotated distinct operation.

Diagram of the annotated distinct operation.

例子

现在有一个名为 records 的集合中 只有 下面这些文档:

{ a: 1, b: 0 }
{ a: 1, b: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 4 }
{ a: 2, b: 2 }
{ a: 2, b: 2 }

请看下面使用 db.collection.distinct() 方法对字段 b 进行去除重复的操作:

db.records.distinct( "b" )

这个操作的结果是:

[ 0, 1, 4, 2 ]

分组

分组 操作会把查询到的文档按照给定的字段值进行分组。分组操作会返回一个文档数组,其中的每个文档包含了一组文档的计算结果。

可以在 mongo 脚本程序中通过 group 命令或者 db.collection.group() 方法来使用分组的功能。

警告

group 命令不能在分片集合上运行。特别需要注意一点, group 操作的结果集大小不能超过16MB。

请看下面的分组操作:

例子

现在有一个名为 records 的集合,它包含有如下文档:

{ a: 1, count: 4 }
{ a: 1, count: 2 }
{ a: 1, count: 4 }
{ a: 2, count: 3 }
{ a: 2, count: 1 }
{ a: 1, count: 5 }
{ a: 4, count: 4 }

请考虑用 group 命令对集合中的文档进行分组,分组条件是字段 a 值小于 3 ,同时需要对每组的 count 字段计数:

db.records.group( {
   key: { a: 1 },
   cond: { a: { $lt: 3 } },
   reduce: function(cur, result) { result.count += cur.count },
   initial: { count: 0 }
} )

这次分组操作的结果是:

[
  { a: 1, count: 15 },
  { a: 2, count: 4 }
]

参见

$group 管道的相关用法请参考 聚合管道