为什么 PyMongo count_documents 比 count 慢?

Thr*_*irl 11 mongodb pymongo mongodb-query pymongo-3.x

db['TF']我大约有60万条记录。

我需要获取记录的数量。

如果我运行db['TF'].count(),它会立即返回。

如果我运行db['TF'].count_documents({}),那么在我得到结果之前需要很长时间。

但是,该count方法将被弃用。

那么,如何在使用时快速获取数量count_documents呢?有没有我错过的一些论点?

我已经阅读了文档和代码,但没有找到。

非常感谢!

Ami*_*ner 13

这不是关于 PyMongo,而是关于 Mongo 本身。

count是一个原生的 Mongo 函数。它并没有真正计算所有文件。每当您在 Mongo 中插入或删除记录时,它都会缓存集合中的记录总数。然后当您运行时count,Mongo 将返回该缓存值。

count_documents使用查询对象,这意味着它必须遍历所有记录才能获得总数。因为您没有传递任何参数,所以它必须运行所有 6000 万条记录。这就是它慢的原因。

基于@Stennie 评论

您可以在 PyMongo 3.7+ 中使用estimated_document_count() 返回基于集合元数据的快速计数。最初的 count() 已被弃用,因为根据是否提供了查询条件,行为会有所不同(估计与实际计数)。较新的驱动程序 API 更注重结果

  • @jschmitter 您可以在 PyMongo 3.7+ 中使用 [`estimated_data_count()`](http://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.estimated_document_count) 来返回基于集合元数据的快速计数。最初的 `count()` 已被弃用,因为根据是否提供了查询条件,行为会有所不同(估计与实际计数)。较新的驱动程序 API 更注重结果。 (5认同)
  • 那么为什么根据 pymongo 不推荐使用 count() 呢?count_documents() 需要很长时间才能在大型数据集上运行。 (3认同)