在MongoDB中计算文档的7种方法

发布于

MongoDB提供了各种方法来计算集合或视图中的文档。还有一些聚合运算符可用于对来自上一个聚合管道阶段的传入文档进行计数。

本文介绍了以下计算 mongo shell 中文档的方法:

  • 命令count
  • 方法db.collection.count()
  • 方法db.collection.countDocuments()
  • 方法db.collection.estimatedDocumentCount()
  • 方法cursor.count()
  • 聚合管道运算符$count
  • 聚合管道运算符$sortByCount

命令count

该命令计算集合或视图中的文档数。count

例:

db.runCommand( { 
    count: "pets", 
    query: { type: "Dog" } 
} )

结果:

{ “n” : 4, “ok” : 1 }

在此示例中,我们可以看到集合中有四只狗。pets

我们还可以看到它返回一个包含计数和命令状态的文档。

方法db.collection.count()

该方法返回与集合或视图的查询匹配的文档计数。db.collection.count()``find()

部件是要对其执行计数操作的集合或视图的名称。collection

该方法是命令的包装方法。db.collection.count()``count

例:

db.pets.count({
    "type": "Dog"
})

结果:

4

该方法不像命令那样返回文档。它只是返回计数。db.collection.count()``count

方法countDocuments()

该方法返回与集合或视图的查询匹配的文档计数。db.collection.countDocuments()

部件是要对其执行计数操作的集合或视图的名称。collection

例:

db.pets.countDocuments({
    "type": "Dog"
})

结果:

4

与 的结果基本相同,尽管建议使用而不是如果可能的话。db.collection.count()``countDocuments()``count()

MongoDB文档指出:

与 4.0 功能兼容的 MongoDB 驱动程序弃用了它们各自的游标和集合 API,转而使用 和 的新 API。有关给定驱动程序的特定 API 名称,请参阅驱动程序文档。count()``countDocuments()``estimatedDocumentCount()

此外,在没有查询谓词的情况下使用时,依赖于元数据,这可能会导致近似计数。另一方面,该方法不依赖于元数据,并通过执行文档聚合来返回准确的计数。count()``countDocuments()

方法estimatedDocumentCount()

该方法是返回集合或视图中所有文档计数的命令的包装器。db.collection.estimatedDocumentCount()``count

例:

db.pets.estimatedDocumentCount()

结果:

7

该方法不采用查询筛选器。相反,它使用元数据来返回整个集合/视图的文档计数。db.collection.estimatedDocumentCount()

方法cursor.count()

该方法是命令的包装器,用于计算游标引用的文档数。cursor.count()``count

它实际上并不执行查询。它只是计算并返回查询将返回的结果数。

例:

db.pets.find({"type": "Dog"}).count()

结果:

4

这等效于上面的方法示例。db.collection.count()

如上所述,与 4.0 功能兼容的 MongoDB 驱动程序弃用了它们各自的游标和集合 API,转而使用 和 的新 API。count()``countDocuments()``estimatedDocumentCount()

聚合管道运算符$count

聚合运算符将文档传递到聚合管道中的下一个阶段,该阶段包含输入到当前阶段的文档数的计数。$count

例:

db.pets.aggregate([
    {
      $match: { type: "Dog" }
    },
    {
      $count: "DogCount"
    }
])

结果:

{ “DogCount” : 4 }

下面是另一个示例,演示如何使用此运算符对分组结果进行计数。

db.pets.aggregate([
    {
      $match: { weight: { $lt: 30 } }
    },
    {
      $group: { _id: "$type", count: { $sum: 1 } }
    },
     { 
      $sort : { count : -1, _id: 1 } 
    }
])

输出:

{ "_id" : "Dog", "count" : 3 }
{ "_id" : "Cat", "count" : 2 }
{ "_id" : "Bat", "count" : 1 }

通过使用聚合管道运算符(如下所示),可以使用较少的代码完成此特定查询。$sortByCount

聚合管道运算符$sortByCount

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

以下是我们如何实现与前面示例相同的结果:$sortByCount

db.pets.aggregate([
    {
      $match: { weight: { $lt: 30 } }
    },
    {
      $sortByCount: "$type"
    }
])

结果:

{ “_id” : “Dog”, “count” : 3 } { “_id” : “Cat”, “count” : 2 } { “_id” : “Bat”, “count” : 1 }

每个组都输出在其自己的文档中,该文档由两个字段组成:

  • 包含非重复分组值的字段,以及_id
  • 包含属于该分组的文档数的字段。count

文档按降序排序。count