在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